• 父类上的注解能被子类继承吗


    父类上的注解能被子类继承吗

    我们知道在编写自定义注解时,可以通过指定@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 只是可控制 对类名上注解是否可以被继承。不能控制方法上的注解是否可以被继承。

    附注 Transactional 

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

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

  • 相关阅读:
    AgileEAS.NET平台视频会议培训第二辑简单插件开发应用演练(速度下载)
    给大家分享一个培训的PPT:面向构件的组织级开发模式探讨
    AgileEAS.NET SOA 中间件平台工作流系统介绍
    “医疗信息化行业之中的联发科” 我们在医疗行业中的定位及目标
    AgileEAS.NET SOA 平台5.1开发包介绍
    实例演示如何使用AgileEAS.NET SOA平台工作流进行业务流程自定义
    Silverlight企业应用开发实践AgileEAS.NET平台5.0 Silverlight支撑预览
    AgileEAS.NET平台视频会议培训第三辑插件的安装、配置以及账户权限系统演练
    Stream Part.6
    Stream Part.7
  • 原文地址:https://www.cnblogs.com/fanguangdexiaoyuer/p/10692840.html
Copyright © 2020-2023  润新知