java反射读取注解需用@retention(retentionpolicy.runtime)声明,否则getannotation()返回null;获取后调用方法可得属性值,建议判空处理,并封装为配置类以提升性能与安全性。

Java 反射机制可以通过 Class 对象直接获取类上声明的注解,再调用注解的方法提取属性值;关键在于注解必须用 @Retention(RetentionPolicy.RUNTIME) 修饰,否则运行时不可见。
确保注解在运行时可用
只有被 @Retention(RetentionPolicy.RUNTIME) 标记的注解,才能通过反射读取。如果漏了这行,getAnnotation() 总是返回 null。
示例定义一个可反射读取的注解:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME) // 必须有这一行
public @interface AppConfig {
String value() default "";
String version() default "1.0";
int timeout() default 3000;
}
获取类上的注解实例
拿到 Class 对象后,调用 getAnnotation(注解类.class) 即可获得注解实例。该实例是 JVM 在运行时动态生成的代理对象,支持直接调用其方法获取属性值。
常见写法:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
MyService.class.getAnnotation(AppConfig.class)—— 获取单个注解 -
MyService.class.getAnnotations()—— 获取所有注解(含重复注解需配合@Repeatable) -
MyService.class.isAnnotationPresent(AppConfig.class)—— 先判断是否存在,避免空指针
安全读取注解属性值
获取到注解对象后,直接调用其方法即可,JVM 会自动返回声明的默认值或显式设置的值。注意处理可能的 NullPointerException(比如注解不存在时返回 null)。
推荐写法:
AppConfig config = MyService.class.getAnnotation(AppConfig.class);
if (config != null) {
String value = config.value();
String version = config.version();
int timeout = config.timeout();
System.out.println("value=" + value + ", version=" + version + ", timeout=" + timeout);
}
结合配置类统一管理注解信息
实际项目中常把注解作为轻量级配置入口,再封装成配置类供其他模块使用。例如:
- 定义一个
ConfigLoader工具类,扫描指定包下带@AppConfig的类 - 遍历每个类,提取注解属性,组装为
AppConfigDTO列表 - 注入 Spring 容器或作为静态配置缓存,避免重复反射调用
这样既利用了注解的简洁性,又规避了频繁反射带来的性能开销和空值风险。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










