java反射可读取runtime注解,需注解声明@retention(retentionpolicy.runtime),再通过getannotation()在类、方法、字段上获取;私有成员需setaccessible(true),父类注解不自动继承,@inherited仅适用于类级注解。

可以通过 Java 反射机制,在运行时读取 @Retention(RetentionPolicy.RUNTIME) 的注解信息。关键前提是:注解必须声明为 RUNTIME 保留策略,且目标元素(类、方法、字段等)确实被该注解标记。
确保注解定义正确
注解类本身需显式指定 @Retention(RetentionPolicy.RUNTIME),否则反射无法获取:
- 缺少
@Retention或设为CLASS/SOURCE,调用getAnnotation()将始终返回null - 建议同时添加
@Target明确作用位置(如ElementType.METHOD),避免误用
通过反射获取注解实例
根据注解所在位置,选择对应反射 API:
- 类上:使用
clazz.getAnnotation(YourAnno.class) - 方法上:先获取
Method对象,再调用method.getAnnotation(YourAnno.class) - 字段上:用
field.getAnnotation(YourAnno.class) - 若需获取全部注解,可用
getAnnotations()或getDeclaredAnnotations()
注意访问权限与继承性
默认情况下,反射只能获取当前元素**直接声明**的注解:
- 父类方法上的注解不会被子类重写方法自动继承,除非注解本身标注了
@Inherited(仅对类级别注解生效) - 私有方法、字段需先调用
setAccessible(true)才能访问(涉及安全检查) - 接口中的默认方法或静态方法,注解行为与普通方法一致,可正常反射读取
常见问题排查
如果 getAnnotation() 返回 null,优先检查以下几点:
- 注解类是否加了
@Retention(RetentionPolicy.RUNTIME) - 目标元素是否确实被该注解标注(注意拼写、导入路径是否正确)
- 运行环境是否加载了注解类(如模块隔离、ClassLoader 不同导致类不可见)
- 是否在注解还未被处理的阶段(如某些 AOP 或字节码增强框架会延迟生成)就尝试读取










