最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Java注解继承机制验证:@Inherited测试案例
时间:2026-06-24 08:39:02 编辑:袖梨 来源:一聚教程网
@Inherited仅对类层级注解生效,需同时满足@Inherited、@Target(TYPE)、@Retention(RUNTIME)三条件;方法、字段、接口及参数注解均不继承,子类重写后须手动遍历继承链查找。
Java 中的注解默认不继承,@Inherited 是唯一能影响继承行为的元注解,但它只对类级别(TYPE)注解生效,且有明确限制——不能用于接口、方法或参数,也不能跨重写传播。
类上注解可被子类继承(需 @Inherited)
只有同时满足以下条件,子类才能通过 getAnnotation() 直接获取父类的注解:
- 自定义注解声明了
@Inherited - 该注解标注在父类上(
@Target(ElementType.TYPE)) - 子类直接继承父类(非实现接口)
例如:
@Inherited@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)public @interface MyService { String value() default "";}@MyService("UserService")public class UserServiceImpl {}public class AdminServiceImpl extends UserServiceImpl {} // ✅ 继承成功
调用 AdminServiceImpl.class.getAnnotation(MyService.class) 将返回非 null 注解实例。
立即学习“Java免费学习笔记(深入)”;
方法和参数注解不会自动继承
即使方法上的注解也标注了 @Inherited,只要子类重写了该方法,就无法通过反射在子类方法对象上直接获取该注解:
- 父类方法有
@MyLog注解 → 子类未重写时,getMethod(...).getAnnotation(MyLog.class)可取到 - 子类
@Override了该方法 → 即使方法体为空,注解也不会出现在子类方法对象上 - 参数注解同理:重写后,
Parameter.isAnnotationPresent(...)返回 false
这是 JVM 规范行为,@Inherited 对 METHOD/PARAMETER 无效。
接口上的注解一律不继承
无论接口或其实现类是否使用 @Inherited,都不会触发继承:
- 接口
IUser标注@MyApi(带@Inherited) - 类
UserImpl implements IUser→UserImpl.class.getAnnotation(MyApi.class)一定为 null - 子接口
IAdmin extends IUser→ 同样无法继承@MyApi
接口不是继承关系(is-a),而是契约关系(implements),JVM 不为此提供注解传递机制。
绕过限制的常用做法
当需要“逻辑继承”方法注解时,需手动沿继承链查找:
- 用
Class.getSuperclass()逐级向上获取父类 - 对每个父类调用
getMethod(name, paramTypes)并检查注解 - 遇到
NoSuchMethodException或到达Object.class停止
Spring 的 AnnotationUtils.findAnnotation() 就是这种策略的封装,支持跨层级查找方法和参数注解。
相关文章
- AI 提效是假象还是红利:用 LoongSuite + SLS 构建组织级 AI 编码度量看板 07-03
- 教程上新丨16GB 笔记本跑出接近 26B MoE 性能:Gemma 4 12B 基于创新架构统一处理文本 / 图像 / 声音三种模态 07-03
- Gemini 3.5 Live Translate - 谷歌打造的实时语音翻译与跨语言沟通模型 07-03
- 《王者荣耀世界》定云除厄记完成方法 07-03
- LongCat-Video-Avatar 1.5开源:具备全领域泛化能力的音频驱动视频生成模型;AI Student Impact Dataset 5 万量级多 07-03
- 什么是 RAG?为什么仅靠大模型的记忆力远远不够 07-03