getannotations()获取当前元素及继承的运行时注解(仅类上@inherited有效),getdeclaredannotations()仅获取本元素显式声明的注解,不继承;重复注解需用getdeclaredannotationsbytype()获取全部。

这两个方法都用于获取类、方法或字段上的注解,但作用范围不同,关键区别在于是否继承父类/接口中的注解。
getAnnotations():获取所有可见的运行时注解
返回当前元素(类、方法等)上声明的注解,**包括从父类、父接口或超类型继承来的注解**(前提是这些注解本身被 @Inherited 元注解标记,且目标类型是 TYPE)。但注意:Java 中只有 @Inherited 对类层级有效,对方法和字段无效。所以实际中,getAnnotations() 在大多数场景下等价于 getDeclaredAnnotations(),除非处理的是被 @Inherited 修饰的类注解。
- 只返回
@Retention(RetentionPolicy.RUNTIME)的注解 - 若目标注解未加
@Inherited,或作用在方法/字段上,则不会继承 - 适合需要“语义上可见的所有注解”的场景,比如框架统一扫描配置
getDeclaredAnnotations():仅获取本元素直接声明的注解
只返回在当前类、方法、字段等**源码中显式写出来的注解**,完全不考虑继承关系,也不管注解是否被 @Inherited 标记。
- 结果更确定、可预测,不受父类影响
- 是获取自定义注解最常用、最安全的方式
- 配合
isAnnotationPresent(Class)使用,能准确判断某个注解是否存在
重复注解(@Repeatable)需用特殊方法
如果注解被 @Repeatable(Container.class) 标记(如多个 @Role("admin")),那么:
-
getDeclaredAnnotation(MyAnno.class)只返回第一个,或 null(即使有多个) - 必须用
getDeclaredAnnotationsByType(MyAnno.class)才能拿到全部实例 -
getAnnotationsByType()同理,支持继承语义(若适用)
小技巧:快速验证区别
写一个父类加 @MyConfig("base"),子类不加;确保 @MyConfig 带 @Target(TYPE) 和 @Inherited。然后分别调用两个方法看子类是否返回该注解——只有 getAnnotations() 可能返回,getDeclaredAnnotations() 一定为空。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











