可通过反射获取类上runtime保留策略的注解及其属性值:先用getannotation()获取代理实例(需判空),再调用其方法读取属性;重复注解需用getannotationsbytype()。

可以通过反射获取类上声明的注解及其属性值,关键在于使用 Class.getAnnotation() 获取注解实例,再调用其方法读取属性。
确认注解保留策略为 RUNTIME
只有当注解用 @Retention(RetentionPolicy.RUNTIME) 声明时,才能在运行时通过反射访问。如果保留策略是 SOURCE 或 CLASS,反射将无法获取。
- 检查注解定义中是否包含 @Retention(RetentionPolicy.RUNTIME)
- 若自定义注解未指定,默认为
CLASS,需显式加上RUNTIME
使用 getAnnotation() 获取注解对象
调用类的 getAnnotation(Class<a> annotationClass)</a> 方法,传入目标注解类型,返回该注解的代理实例。
- 若类未标注该注解,返回
null,使用前建议判空 - 返回的是 JVM 动态生成的代理对象,不是原始注解类的实例
- 示例:
MyAnnotation ann = clazz.getAnnotation(MyAnnotation.class);
调用注解方法获取属性值
注解的每个属性在字节码中表现为一个无参方法,直接调用即可获得对应值。
- 如注解定义
String value() default "abc";,则调用ann.value() - 数组属性(如
String[] roles();)返回普通 Java 数组,可直接遍历 - 嵌套注解属性返回另一个注解代理对象,可继续调用其方法
处理重复注解和容器注解(Java 8+)
若使用 @Repeatable,需用 getAnnotationsByType() 替代 getAnnotation()。
-
getAnnotation()只返回容器注解本身(如@Roles) -
getAnnotationsByType(Role.class)直接返回所有被包裹的@Role实例数组 - 容器注解必须用
@Retention(RUNTIME)且声明value()属性为该注解数组类型










