运行期通过反射处理@runtime注解需满足:注解必须声明@retention(retentionpolicy.runtime),再通过getdeclaredmethod()和getannotation()获取并解析其属性,用于权限校验、参数检查等场景,注意缓存method、捕获异常及避免重复解析。

运行期通过反射处理 @Runtime 注解,核心在于:注解必须声明为 @Retention(RetentionPolicy.RUNTIME),且需通过反射获取类、方法或字段上的注解实例,再根据其属性执行对应业务逻辑。
确保注解可被运行时读取
这是前提。若注解未设置 RUNTIME 保留策略,反射将无法获取:
- 在自定义注解上明确添加
@Retention(RetentionPolicy.RUNTIME) - 避免仅用
@Retention(RetentionPolicy.CLASS)或SOURCE,它们在运行期不可见 - 如需作用在方法上,还需加上
@Target(ElementType.METHOD)等限定
通过反射获取并解析注解
以方法级注解为例,典型流程如下:
- 用
clazz.getDeclaredMethod("methodName")获取目标方法(注意 setAccessible(true) 处理私有方法) - 调用
method.getAnnotation(YourAnnotation.class)获取注解对象 - 判空后,读取注解属性(如
anno.value()、anno.required())参与逻辑判断 - 可结合
method.invoke(target, args)在条件满足时才执行该方法
常见业务场景示例
这类机制常用于轻量级切面控制,例如:
-
权限校验:定义
@RequireRole("ADMIN"),反射读取后比对当前用户角色 -
参数非空检查:标注
@NotNull,在方法执行前校验入参是否为 null -
日志埋点:用
@LogExecutionTime自动统计方法耗时并打印 -
缓存开关:通过
@Cacheable(enabled = true)控制是否走缓存逻辑
注意事项与优化建议
实际使用中需关注性能和健壮性:
- 反射调用开销较大,高频场景建议缓存
Method对象或注解解析结果(如用ConcurrentHashMap) - 捕获
NoSuchMethodException、IllegalAccessException等异常,避免因反射失败导致主流程中断 - 避免在循环内反复调用
getAnnotation(),提取到方法外或初始化阶段完成解析 - 注解属性尽量设计为编译期常量(如 String、Class、枚举),避免运行期动态计算










