必须使用@retention(retentionpolicy.runtime)才能在运行期通过反射读取自定义注解,因为默认策略retentionpolicy.class不保留注解至运行时,否则getannotation()返回null。

在 Java 中,若想让自定义注解在运行期(Runtime)仍可被反射读取,必须使用 @Retention(RetentionPolicy.RUNTIME) 显式声明保留策略。
为什么需要 @Retention(RetentionPolicy.RUNTIME)
Java 注解默认的保留策略是 RetentionPolicy.CLASS,即只保留在编译后的字节码中,但 JVM 不会将其加载到运行时内存。如果不加 @Retention 或设为 SOURCE / CLASS,调用 getAnnotation() 会返回 null,无法在运行时获取注解信息。
正确声明运行时注解的写法
定义注解时,在注解定义上方添加 @Retention(RetentionPolicy.RUNTIME):
@Retention(RetentionPolicy.RUNTIME)
public @interface LogExecutionTime {
String value() default "method";
}
这样该注解就会被 JVM 保留在运行时,可通过反射访问。
运行时读取注解的典型用法
- 使用
Class.getAnnotation()获取类上的注解 - 使用
Method.getAnnotation()获取方法上的注解 - 使用
Field.getAnnotation()获取字段上的注解 - 注意:目标元素(类、方法等)本身需存在该注解,且所在类已被 JVM 加载
常见遗漏点
- 忘记加
@Retention,或误写成@Retention(RetentionPolicy.SOURCE) - 未配合
@Target指定合法使用位置(如只允许用于方法,却用在字段上) - 反射读取前未检查注解是否为
null,导致空指针异常 - 在 Spring 等框架中,若注解用于 AOP 或自动配置,还需确保类被正确扫描和代理
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











