核心在于通过反射获取运行时可见的注解实例并调用其方法提取属性值,以此驱动条件分支、策略映射等逻辑;必须声明@Retention(RetentionPolicy.RUNTIME)并配合isAnnotationPresent()校验存在性,再用getDeclaredXXX()获取私有元素注解,安全调用属性方法即可获得编译期确定类型的值。

核心在于:先用反射拿到注解实例,再调用其方法获取属性值,最后用这些值驱动 if/switch 或策略映射。
确保注解在运行时可见
这是前提。如果注解没声明 @Retention(RetentionPolicy.RUNTIME),反射就完全读不到它,后续所有逻辑都会失效。
- 必须显式加上
@Retention(RetentionPolicy.RUNTIME) - 建议同时加
@Target明确作用位置(如ElementType.METHOD或ElementType.TYPE) - 避免使用
RetentionPolicy.SOURCE或CLASS,它们在运行期不可见
准确获取目标元素的注解实例
不能只写 getAnnotation() 就完事——得确认它真被标注了,且目标元素(类、方法、字段)找对了。
- 先用
isAnnotationPresent(YourAnno.class)判断是否存在,避免空指针 - 再调用
getAnnotation(YourAnno.class)获取实例 - 注意:
getDeclaredMethod("xxx")和getMethod("xxx")行为不同,前者能拿到 private 方法上的注解,后者只能访问 public 方法 - 字段同理,用
getDeclaredField("xxx")才能读到 private 字段上的注解
安全提取属性值并参与逻辑判断
注解方法调用看似简单,但默认值、null、类型转换都可能出错。
立即学习“Java免费学习笔记(深入)”;
- 直接调用
anno.value()、anno.level()等方法即可获取对应属性值 - 注意默认值:比如
String desc() default "",没显式赋值时返回空字符串而非 null - 若属性是数组(如
String[] tags()),返回的是真实数组,可直接遍历或用Arrays.asList() - 不要手动做字符串解析或类型强转——注解属性本身就是编译期确定的类型,反射返回的就是正确类型
用属性值驱动分支逻辑的常见模式
拿到值后,不一定要写一堆 if-else,更推荐结构清晰、易扩展的方式。
-
条件分支:直接用
if (anno.priority() > 5) { ... }或switch (anno.mode()) { case "ASYNC": ... } -
策略映射:提前把不同注解值和对应处理器放进
Map<String, Handler>,运行时查表执行 -
配置开关:用布尔型注解属性(如
boolean enableLog())控制日志、缓存、熔断等行为开关 -
元数据路由:比如根据
@Route(path = "/user")的path值注册接口路径,替代硬编码


















