转载自 子类可以继承到父类上的注解吗?

不了解注解基础知识的请先看《JDK 5 Annotation\注解\注释\自定义注解》

子类可以继承到父类上的注解吗?

我们知道在编写自定义注解时,可以通过指定@Inherited注解,指明自定义注解是否可以被继承。但实现情况又可细分为多种。

测试环境如下:

父类的类上和方法上有自定义的注解--MyAnnotation

子类继承了这个父类,分别:

子类方法,实现了父类上的抽象方法

子类方法,继承了父类上的方法

子类方法,覆盖了父类上的方法

MyAnnotation自定义注解

package  test.annotation;
import  java.lang.annotation.Inherited;
import  java.lang.annotation.Retention;
/**  * 自定义注解  */
//@Inherited  //可以被继承
@Retention (java.lang.annotation.RetentionPolicy.RUNTIME)   //可以通过反射读取注解
public   @interface  MyAnnotation {    String value();
}

父类

package  test.annotation;
@MyAnnotation (value =  "类名上的注解" )
public   abstract   class  ParentClass {  @MyAnnotation (value =  "父类的abstractMethod方法" )  public   abstract   void  abstractMethod();  @MyAnnotation (value =  "父类的doExtends方法" )  public   void  doExtends() {  System.out.println(" ParentClass doExtends ..." );  }  @MyAnnotation (value =  "父类的doHandle方法" )  public   void  doHandle(){  System.out.println(" ParentClass doHandle ..." );  }
} 

子类

package  test.annotation;
public   class  SubClass  extends  ParentClass{    //子类实现父类的抽象方法   @Override     public   void  abstractMethod() {    System.out.println("子类实现父类的abstractMethod抽象方法" );    }    //子类继承父类的doExtends方法   //子类覆盖父类的doHandle方法   @Override     public   void  doHandle(){  System.out.println("子类覆盖父类的doHandle方法" );   }
} 

测试类

package  test.annotation;  import  java.lang.reflect.Method;  public   class  MainTest {  public   static   void  main(String[] args)  throws  SecurityException,  NoSuchMethodException {  Class<SubClass> clazz = SubClass.class ;  if  (clazz.isAnnotationPresent(MyAnnotation. class )) {  MyAnnotation cla = clazz  .getAnnotation(MyAnnotation.class );  System.out.println("子类继承到父类类上Annotation,其信息如下:" +cla.value());  } else  {  System.out.println("子类没有继承到父类类上Annotation" );  }  // 实现抽象方法测试   Method method = clazz.getMethod("abstractMethod" ,  new  Class[] {});  if  (method.isAnnotationPresent(MyAnnotation. class )) {  MyAnnotation ma = method  .getAnnotation(MyAnnotation.class );  System.out.println("子类实现父类的abstractMethod抽象方法,继承到父类抽象方法中的Annotation,其信息如下:" +ma.value());  } else  {  System.out.println("子类实现父类的abstractMethod抽象方法,没有继承到父类抽象方法中的Annotation" );  }  //覆盖测试   Method methodOverride = clazz.getMethod("doExtends" ,  new  Class[] {});  if  (methodOverride.isAnnotationPresent(MyAnnotation. class )) {  MyAnnotation ma = methodOverride  .getAnnotation(MyAnnotation.class );  System.out  .println("子类继承父类的doExtends方法,继承到父类doExtends方法中的Annotation,其信息如下:" +ma.value());  } else  {  System.out.println("子类继承父类的doExtends方法,没有继承到父类doExtends方法中的Annotation" );  }  //继承测试   Method method3 = clazz.getMethod("doHandle" ,  new  Class[] {});  if  (method3.isAnnotationPresent(MyAnnotation. class )) {  MyAnnotation ma = method3  .getAnnotation(MyAnnotation.class );  System.out  .println("子类覆盖父类的doHandle方法,继承到父类doHandle方法中的Annotation,其信息如下:" +ma.value());  } else  {  System.out.println("子类覆盖父类的doHandle方法,没有继承到父类doHandle方法中的Annotation" );  }  }
} 

编写自定义注解时未写@Inherited的运行结果

子类没有继承到父类类上Annotation

子类实现父类的abstractMethod抽象方法,没有继承到父类抽象方法中的Annotation

子类继承父类的doExtends方法,继承到父类doExtends方法中的Annotation,其信息如下:父类的doExtends方法

子类覆盖父类的doHandle方法,没有继承到父类doHandle方法中的Annotation

编写自定义注解时写了@Inherited的运行结果

子类继承到父类类上Annotation,其信息如下:类名上的注解

子类实现父类的abstractMethod抽象方法,没有继承到父类抽象方法中的Annotation

子类继承父类的doExtends方法,继承到父类doExtends方法中的Annotation,其信息如下:父类的doExtends方法

子类覆盖父类的doHandle方法,没有继承到父类doHandle方法中的Annotation

结论

父类的类上和方法上有自定义的注解,

子类继承了这个父类,的情况下。

  编写自定义注解时未写@Inherited的运行结果: 编写自定义注解时写了@Inherited的运行结果:
子类的类上能否继承到父类的类上的注解?
子类方法,实现了父类上的抽象方法,这个方法能否继承到注解?
子类方法,继承了父类上的方法,这个方法能否继承到注解?
子类方法,覆盖了父类上的方法,这个方法能否继承到注解?

我们知道在编写自定义注解时,可以通过指定@Inherited注解,指明自定义注解是否可以被继承。

通过测试结果来看,@Inherited 只是可控制 对类名上注解是否可以被继承。不能控制方法上的注解是否可以被继承。

附注

Spring 实现事务的注解@Transactional 是可以被继承的,

通过查看它的源码可以看到@Inherited。

子类可以继承到父类上的注解吗相关推荐

  1. 【BAT面试题典】子类可以继承到父类上的注解吗?

    子类重写父类方法后,可以继承方法上的注解吗? 这个不急,让我来分析一下,假设有如下注解: 定义被注解的类 子类直接继承父类 获取父子类和方法的注解信息,并输出注解的value属性的值 日志输出 可见子 ...

  2. java中子类能否继承 重写父类的静态方法

    文章目录 1.疑问 子类能否继承父类的静态变量和静态方法 子类能否重写父类的静态方法 2. 原因 1.疑问 子类能否继承父类的静态变量和静态方法 首先,子类是可以继承父类的静态变量和静态方法的. cl ...

  3. 类的继承定义一个computer类在此基础上派生出两个子类(继承与多态绑定)

    题目如下 定义一个计算机类(Computer),并在它的基础上派生出两个子类:台上机(Desktop)和便携机类(Notebook),在Computer中定义几个方法,并在子类Desktop和Note ...

  4. java 子类继承父类_关于Java 的继承问题,子类会继承父类的哪些东西?-----转载...

    和C++类似,可以继承基类的公共属性和方法. 在Java继承里,父类的属性还有方法在声明时,如果是public关键字即公共属性,则在子类继承时,这些属性和方法都会被子类继承.受保护的也可以继承 但是私 ...

  5. 接口方法上的注解无法被@Aspect声明的切面拦截的原因分析

    转载自  接口方法上的注解无法被@Aspect声明的切面拦截的原因分析 前言 在Spring中使用MyBatis的Mapper接口自动生成时,用一个自定义的注解标记在Mapper接口的方法中,再利用@ ...

  6. java父类声明子类实现_java中父类声明子类实例化

    问题: 1.比如两个类父类:Person 子类 Student extends Person在使用时候,这样写:Person person=null; //声明对象person=new Student ...

  7. C++继承中父类和子类之间的赋值兼容

    文章目录 1 C++继承中父类和子类之间的赋值兼容 1.1 父子间的赋值兼容 1.2 特殊的同名函数 1 C++继承中父类和子类之间的赋值兼容 1.1 父子间的赋值兼容 在公有继承的条件下,子类对象可 ...

  8. java 中普通类继承,抽象类继承,接口类继承,子类一定要重写父类中的方法吗

    一.简单总结,需要重写的有 普通类继承抽象类,重写所有抽象类方法:(不包括普通方法) 普通类继承接口,重写所有接口方法.(不包括default关键字修饰的方法) 详解见下: 普通类继承,并非一定要重写 ...

  9. 子类怎么继承父类方法中的变量_关于继承的那些事!

    第二阶段 JAVA面向对象 第二章 继承 其实在我们面向对象这一阶段的学习中,我们就是围绕Java的三大特性(封装.继承.多态)来讲解的,在上一掌内容中我们讲解了一部分封装的有关知识,今天我们来重点学 ...

最新文章

  1. python演变_简说Python生态系统的14年演变
  2. 没想到,因为这场AI大会,我也可以凡尔赛一把
  3. burpsuite 简单介绍
  4. linux Centos下磁盘分区及文件系统创建与挂载
  5. vector的学习(系统的学习)
  6. python- 属性 静态方法,类方法
  7. mysql 、慢查询、到底如何玩
  8. 带SN切换流程_贴片电阻生产工艺流程简介
  9. 基于OPENCV的OCR身份证号识别技术
  10. 别让我们的幸福感受在别人眼中
  11. 积极主动 个人愿景的原则_IT专家的愿景:您个人需要了解的内容
  12. jquery attr设置属性失效问题
  13. 钰泰ETA2821,42V/1.5A降压转换器,集成OVP功能防浪涌
  14. 2022年全国最新消防设施操作员模拟试题题库及答案
  15. LuaBox积木编程开发手册-精编版
  16. 图像处理之混合空间增强——(Java:拉普拉斯锐化、Sobel边缘检测、均值滤波、伽马变换)
  17. 20220215-CTF-MISC-BUUCTF-小明的保险箱-binwalk分析-dd命令分离出RAR文件-ARCHPR暴力破解密码
  18. qq机器人如何滑动验证码验证TxCaptchaHelper
  19. 3dmax常用快捷键来了!!
  20. 地球坐标,火星坐标,百度坐标转换

热门文章

  1. [Java基础]反射获取成员变量并使用练习
  2. 写出TREE-PREDECESSOR的伪代码(算法导论第三版12.2-3)
  3. 找出第二小元素(算法导论第三版9.1-1题)
  4. 算法-排序-计数排序(包含对非负数和整数的排序)
  5. 递归函数中局部变量和全局变量
  6. Max Sum Plus Plus HDU - 1024(动态规划求最大M子段和)
  7. Aladdin and the Flying Carpet (素数打表+正整数的唯一分解定理,找因数对)
  8. Codeforces Round #737 (Div. 2) D. Ezzat and Grid 线段树动态开点
  9. 【NOI2019】 机器人 【区间dp】【插值】【下降幂多项式】【分段函数】
  10. HDU4372 Count the Buildings