Java反射读取类注解需满足:注解声明@Retention(RetentionPolicy.RUNTIME);调用Class#getAnnotation(Class)获取直接声明的注解;属性通过方法调用读取;@Inherited仅对类继承有效且不跨接口。

Java 中可以通过反射的 Class#getAnnotation(Class) 方法在运行期读取类级别的注解信息。
确认注解具有 RUNTIME 保留策略
只有声明了 @Retention(RetentionPolicy.RUNTIME) 的注解,才能在运行时通过反射获取。如果注解用的是 CLASS 或 SOURCE,反射将无法读到。
- 检查你的自定义注解是否包含
@Retention(RetentionPolicy.RUNTIME) - Java 内置注解如
@Override、@Deprecated默认不是 RUNTIME,不能用于此类反射读取 - 常用可反射注解如
@Test(JUnit)、@Controller(Spring)都明确设为 RUNTIME
使用 Class 对象获取注解
拿到目标类的 Class 实例后,调用 getAnnotation(Class<T>) 即可获取该类上直接声明的指定类型注解(不包括继承来的)。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
MyAnnotation anno = MyClass.class.getAnnotation(MyAnnotation.class);- 若类未声明该注解,方法返回
null,需判空处理 - 如需获取所有注解(不限类型),可用
getAnnotations()或getDeclaredAnnotations()
读取注解中的属性值
注解本质是接口,其属性以方法形式存在。获取注解实例后,直接调用对应方法即可读取值。
立即学习“Java免费学习笔记(深入)”;
- 假设注解定义为:
@interface MyAnnotation { String value() default ""; int order() default 0; } - 读取方式:
String v = anno.value(); int o = anno.order(); - 所有属性方法必须显式调用,不能用反射再取字段 —— 注解属性不对应实际字段
注意继承与元注解的影响
getAnnotation() 默认不查找父类或接口上的注解,也不识别被 @Inherited 标记的注解是否生效(仅对类继承有效,且只影响子类是否“继承”该注解)。
- 若需跨类层级查找,需手动遍历
getSuperclass()链并逐个调用getAnnotation() -
@Inherited仅作用于类级别注解,且仅当子类不声明同类型注解时才“可见” - 接口上的注解不会被实现类继承,
getAnnotation()在实现类上调用查不到接口注解

















