@Inherited仅对类的直接继承生效,不支持接口实现、组合注解传播、多层继承链传递;子类需通过getAnnotation()获取,且父类注解不会跨代传递至间接子类。

@Inherited 只作用于类级别注解,且仅对“直接继承”生效——即子类用 extends 继承父类时,父类上标注了 @Inherited 的注解才会被子类继承;它对实现接口、组合注解(meta-annotation)、以及多层继承链(如 A → B → C)中的间接传递均无效。
组合注解中 @Inherited 不会自动传递
若自定义注解 A 使用了 @Inherited,并被另一个注解 B 作为元注解(即 B 上标注了 @A),这并不意味着 B 具备继承性。@Inherited 是针对“被标注的类”是否向其子类传递,而非作用于注解本身的传播。B 本身是否可被继承,取决于 B 自身是否声明了 @Inherited。
- 即使 A 是 @Inherited,B 标注了 @A,B 仍需显式加 @Inherited 才能被子类继承
- 注解的元注解关系不影响运行时的继承行为,反射获取时只看目标类上实际存在的注解
- 常见误区:以为“@Inherited + @interface B { … }”就能让 B 自动具备继承能力——实际必须写
@Inherited @interface B
三层继承链中仅支持单层传递
@Inherited 不支持跨代传递。假设 ClassA 标注了 @MyAnno,ClassB extends ClassA,ClassC extends ClassB:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- ClassB 能通过
getAnnotation(MyAnno.class)获取到 @MyAnno - ClassC 调用同一方法返回 null —— 即使 ClassB 没有重写或覆盖该注解
- Java 的 Annotation API 在查找时只检查当前类及其直接父类,不递归向上遍历整个继承树
接口实现与注解继承完全无关
@Inherited 对 implements 或 record、enum 等结构无效:
立即学习“Java免费学习笔记(深入)”;
- 接口上标注 @Inherited 注解,实现类不会继承该注解
- 记录类(record)和枚举(enum)无法被继承,故 @Inherited 对它们无意义
- 即使父接口有 @Inherited 注解,子接口继承该接口,注解也不会出现在子接口上
验证建议:用标准反射方式测试
不要依赖 IDE 提示或 Lombok 等工具的模拟逻辑,应以 Class.getAnnotation() 为准:
- 确保测试类使用
extends显式继承,排除匿名类、动态代理等干扰 - 在子类上调用
clazz.getAnnotation(MyAnno.class),而非clazz.getDeclaredAnnotation(...) - 若需多层获取,需手动遍历
getSuperclass()链并逐个调用getAnnotation()

















