子类可以继承到父类上的注解吗--有结论了

编程技术  /  houtizong 发布于 3年前   123

作者:赵磊

博客:http://elf8848.iteye.com

 

不了解注解基础知识的请先看《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。

 

 

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!

留言需要登陆哦

技术博客集 - 网站简介:
前后端技术:
后端基于Hyperf2.1框架开发,前端使用Bootstrap可视化布局系统生成

网站主要作用:
1.编程技术分享及讨论交流,内置聊天系统;
2.测试交流框架问题,比如:Hyperf、Laravel、TP、beego;
3.本站数据是基于大数据采集等爬虫技术为基础助力分享知识,如有侵权请发邮件到站长邮箱,站长会尽快处理;
4.站长邮箱:[email protected];

      订阅博客周刊 去订阅

文章归档

文章标签

友情链接

Auther ·HouTiZong
侯体宗的博客
© 2020 zongscan.com
版权所有ICP证 : 粤ICP备20027696号
PHP交流群 也可以扫右边的二维码
侯体宗的博客