@Retention用于指定注解的生命周期,通过RetentionPolicy枚举控制其保留策略:SOURCE(仅源码)、CLASS(仅class文件)、RUNTIME(运行时可通过反射获取),默认不显式声明则为SOURCE或CLASS;若需运行时读取注解,必须使用@Retention(RetentionPolicy.RUNTIME),如自定义注解MyAnnotation并在反射中使用。

@Retention 是 Java 中的一个注解(元注解),用来指定另一个注解的生命周期,也就是这个注解信息保留到什么时候。简单来说,它控制注解在源码、编译后的 class 文件,还是运行时仍然可用。
Retention 的三种策略
通过 @Retention 注解的参数值(一个枚举类型 RetentionPolicy),可以设置以下三种保留策略:
- RetentionPolicy.SOURCE:注解只保留在源代码中,编译时会被丢弃。这类注解不会出现在 class 文件中,常用于编译期检查,比如 @Override、@SuppressWarnings。
- RetentionPolicy.CLASS:注解会保留在 class 文件中,但 JVM 运行时不会加载。这种策略适用于一些需要在字节码层面处理但不需要运行时读取的场景(较少使用)。
- RetentionPolicy.RUNTIME:注解不仅保留在 class 文件中,还会被 JVM 加载,可以在运行时通过反射获取。这是最灵活的一种,适用于需要动态处理注解逻辑的场景,比如 Spring 中的 @Autowired、Junit 中的 @Test。
如何使用 @Retention
当你自定义一个注解时,如果希望它能在运行时被读取,就必须用 @Retention(RetentionPolicy.RUNTIME) 来标注。
例如:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
立即学习“Java免费学习笔记(深入)”;
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String value();
}
这样,在程序运行时就可以通过反射获取类、方法或字段上的 MyAnnotation 注解信息。
为什么需要 @Retention
Java 编译器默认不会保留所有注解信息。如果不显式指定 @Retention,默认行为是 SOURCE 或 CLASS,具体取决于注解用途。如果你写了一个注解,并希望在运行时通过反射来处理它,就必须明确声明为 RUNTIME,否则反射将无法获取到该注解。
基本上就这些。理解 @Retention 能帮助你正确设计自定义注解,确保它们在需要的时候“可见”。


















