@retention指定注解保留策略,含source(仅源码)、class(字节码中但运行时不可见,默认值)、runtime(运行时可通过反射获取,最常用)三种枚举值。

@Retention 是 Java 中用于指定注解保留策略(即生命周期)的元注解,它决定了该注解在编译、运行时等阶段是否还存在。它的值是一个 RetentionPolicy 枚举,共三种取值,对应不同阶段的可见性。
RetentionPolicy.SOURCE:仅保留在源码阶段
注解只存在于 Java 源文件中,编译后会被彻底丢弃,不会写入 .class 文件。常用于编译期检查类注解,比如 @Override、@SuppressWarnings(部分实现依赖此策略)。
- IDE 或 javac 编译器可读取并校验,但运行时
Class.getAnnotations()找不到 - 不能通过反射获取
RetentionPolicy.CLASS:保留在字节码中,但运行时不可见
注解会被写入 .class 文件,但 JVM 加载类时不会将其加入运行时内存,反射 API 无法访问。
- 适用于某些字节码增强工具(如 ASM、Javassist)在类加载前处理注解
- 默认策略(若未显式声明 @Retention,Java 规定为 CLASS)
RetentionPolicy.RUNTIME:全程保留,运行时可通过反射读取
这是最常用也最灵活的策略。注解不仅保留在 .class 文件中,JVM 还会在运行时将其暴露给反射 API。
- 可通过
Class.isAnnotationPresent()、Method.getAnnotation()等方法获取 - Spring、JUnit、Lombok(部分)等主流框架依赖此策略实现功能
- 示例:@Retention(RetentionPolicy.RUNTIME) public @interface MyApi { String value() default ""; }
不复杂但容易忽略:选错策略会导致反射拿不到注解,调试时看似“注解没生效”,实则是生命周期太短。根据使用场景选对 RetentionPolicy 是注解可用的前提。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











