@Retention
RetentionPolicy.RUNTIME生命周期 : 运行时保留,通过反射访问【反射访问有一定性能开销】
- 源代码阶段:
定义带有@Retention(RetentionPolicy.RUNTIME)的注解
在类、方法、字段等元素上使用注解
此时注解仅存在于源代码中
- 编译阶段:
javac编译器将注解信息嵌入到.class文件中
注解的类型、属性值等元数据被完整保留
与SOURCE策略不同,不会在此阶段被丢弃
- 类加载阶段:
JVM加载.class文件时读取注解信息
注解元数据被加载到方法区(Metaspace )
保持注解与被注解元素的关联关系
- 运行时阶段:
通过反射API可在运行时访问注解信息
使用getAnnotation()、isAnnotationPresent()等方法
注解信息在应用运行期间始终可用
使用场景:
-
AOP(面向切面编程):AspectJ等AOP框架需要在运行时读取注解来实现切面逻辑
-
测试框架: JUnit等测试框架在运行时读取测试注解来执行测试
-
框架配置/依赖注入/权限检查/序列化/反序列化