Java反射获取注解需注解声明@Retention(RUNTIME),通过isAnnotationPresent、getAnnotation等方法定位注解实例,调用其getter方法获取属性值,注意判空及类加载与继承限制。

Java 反射机制处理注解的动态获取与解析,核心在于运行时保留 + 接口暴露 + 属性调用。关键前提是注解必须声明为 @Retention(RetentionPolicy.RUNTIME),否则反射无法读取。
注解必须在运行时可见
只有带 @Retention(RetentionPolicy.RUNTIME) 的注解,编译器才会将其写入 .class 文件的属性区,并在类加载后由 JVM 保留在内存中。缺少这行声明,getAnnotation() 总是返回 null。
-
@Retention(RetentionPolicy.SOURCE):仅保留在源码阶段,编译后丢弃 -
@Retention(RetentionPolicy.CLASS):保留在 .class 中,但运行时不可见 -
@Retention(RetentionPolicy.RUNTIME):运行时可通过反射访问(必需)
通过反射定位并提取注解实例
反射提供三类常用方法来判断和获取注解:
-
isAnnotationPresent(Class<A> annotationClass):快速判断是否存在某注解,性能略优 -
getAnnotation(Class<A> annotationClass):获取注解对象实例,返回null表示未声明 -
getAnnotations():一次性获取所有注解数组,适合批量扫描场景
目标可以是 Class、Method、Field、Constructor 等反射对象,例如:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
MethodInfo info = method.getAnnotation(MethodInfo.class);
调用注解方法获取属性值
Java 中每个注解在运行时都被视为一个接口的代理实例,其属性定义自动转为 getter 方法。因此,直接调用 info.author()、info.date() 即可拿到对应值——无需反射再调用方法,这是注解设计的便利之处。
- 属性名即方法名,无参数,返回声明类型
- 有默认值的属性,未显式赋值时返回默认值
- 若注解未被目标元素声明,调用其方法会抛出
NullPointerException(因 getAnnotation 返回 null),务必先判空或用isAnnotationPresent
注意类加载与注解继承限制
反射读取注解依赖于类已成功加载到 JVM。若类尚未加载(如条件性使用),需确保 Class.forName() 或等效方式已触发初始化。
-
@Inherited仅对类级别注解生效,且只影响子类继承,不传递给方法或字段 - 方法上的注解不会从父类方法继承;字段同理
- 若需跨层级查找(如向上遍历父类找注解),需手动递归调用
getSuperclass().getAnnotation(...)

















