java中可通过反射获取类的注解:用getannotations()获取所有显式声明且可继承的注解,getdeclaredannotation()获取指定注解,getannotationsbytype()处理@repeatable重复注解;调用注解方法读取属性值前需判空;通过isannotationpresent()检查元注解以判断语义归属。

在 Java 中,可以通过反射获取类上声明的所有注解,并读取其属性值。核心是使用 Class#getAnnotations() 或更精确的 Class#getDeclaredAnnotation(Class<t>)</t>,再通过注解实例的方法调用获取属性值。
获取类上所有注解(包括继承的)
getAnnotations() 返回该类**显式声明且未被 @Inherited 排除**的所有注解(含从父类继承的,前提是注解本身标注了 @Inherited)。注意:它不返回 @Repeatable 的重复注解的全部实例(需用 getAnnotationsByType())。
- 用法示例:
Annotation[] annotations = MyClass.class.getAnnotations();
遍历后可强转为具体注解类型,再调用其方法获取属性值。 - 若只想获取某个特定注解(如
@RestController),推荐:
RestController rest = MyClass.class.getDeclaredAnnotation(RestController.class);
若返回null,说明该类没加这个注解。
处理重复注解(@Repeatable)
当注解被 @Repeatable(Container.class) 标记时,不能只靠 getDeclaredAnnotation() 获取单个实例,而应使用:
MyRepeatable[] repeats = MyClass.class.getAnnotationsByType(MyRepeatable.class);
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
getAnnotationsByType()自动展开容器注解,返回所有重复注解实例数组。 - 适用于 Spring 的
@Scope、自定义权限注解等常见场景。
安全读取注解属性值
注解属性本质是接口方法,直接调用即可(JVM 会自动返回默认值或实际值)。但要注意空指针和类型匹配:
- 示例:假设有一个
@ApiVersion(value = "v2", deprecated = true)
ApiVersion api = clazz.getDeclaredAnnotation(ApiVersion.class);
if (api != null) {
String version = api.value(); // 返回 "v2"
boolean isDeprecated = api.deprecated(); // 返回 true
} - 如果属性名是
value且只传一个值,写@ApiVersion("v2")就够了,仍可通过api.value()取出。 - 避免对
null注解实例调用方法,务必先判空。
获取注解的元注解(比如判断是否是 Spring 的 @Component)
有时需要检查一个注解是否“属于某类语义”,例如判断类是否被 Spring 管理:
- 先获取类上的注解,再逐个检查其是否是
@Component或其派生(如@Service):
Annotation[] anns = clazz.getAnnotations();
for (Annotation ann : anns) {
if (ann.annotationType().isAnnotationPresent(Component.class)) {
// 说明这个注解本身(如 @Service)被 @Component 元注解标记
}
} - Spring 内部常用
AnnotationUtils.findAnnotation()或AnnotatedElementUtils做更健壮的查找(支持层级、组合注解等)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










