getdeclaredannotations()仅返回类显式声明的注解,不包含继承自父类或接口的注解;它只读取当前类字节码的runtimevisibleannotations属性,与@inherited元注解无关。

Class.getDeclaredAnnotations() 方法本身就已经只返回类上**显式声明**的注解(即直接写在该类定义上的注解),**不包含继承自父类或接口的注解**。这是它与 Class.getAnnotations() 的关键区别。
明确区分:getDeclaredAnnotations() vs getAnnotations()
getDeclaredAnnotations():仅获取当前类源码中直接声明的注解,不管这些注解是否标注了 @Inherited,也不扫描父类、接口或超类。
getAnnotations():获取当前类所有“可见”的运行时注解,包括自己声明的 + 继承来的(前提是注解类型标注了 @Inherited 且作用于类)。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
确认注解是否被显式声明
只要注解出现在类定义的源码上(如 @MyAnnotation class MyClass { ... }),getDeclaredAnnotations() 就会返回它;如果该注解是父类声明的,即使子类没重写,也不会出现在结果中。
- ✅ 正确示例:
@Loggable @RestController public class UserController { ... }调用UserController.class.getDeclaredAnnotations()会返回@Loggable和@RestController实例。 - ❌ 不会出现的情况:
若
@Loggable是写在BaseController上,而UserController extends BaseController,则UserController.class.getDeclaredAnnotations()中不会包含@Loggable。
注意:元注解和注解本身的继承性不影响 getDeclaredAnnotations()
@Inherited 只影响 getAnnotations() 是否从父类继承注解,对 getDeclaredAnnotations() 完全无影响 —— 它始终只看当前类字节码里的 RuntimeVisibleAnnotations 属性内容。
- 即使某个注解类型声明了
@Inherited,getDeclaredAnnotations()仍只返回当前类自己有的。 - 即使注解类型没加
@Inherited,只要它写在当前类上,就会被getDeclaredAnnotations()拿到。
排除默认/隐式注解的干扰
Java 编译器不会为类自动添加任何注解(不像方法可能有隐式 @Override 等)。所以 getDeclaredAnnotations() 返回的一定是你在源码中明确写出的那些注解。
- 检查编译后的 class 文件(如用
javap -v MyClass.class)可验证:只有你写的注解才会出现在RuntimeVisibleAnnotations属性里。 - 使用 IDE 或反编译工具查看实际生成的注解信息,避免误判泛型、Lombok 等可能生成的额外注解(它们也是显式生成的,属于“声明”范畴)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










