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


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

    我们知道在编写自定义注解时,可以通过指定@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。

  • 相关阅读:
    4种排序实践
    redis 应用场景和数据类型
    建立三个线程,A线程打印10次A,B线程打印10次B,C线程打印10次C
    分布式线程安全(redis、zookeeper、数据库)
    [专项]3道改错题
    kafka 业务埋点
    spring boot集成kafka
    kafka本地调试
    C语言 gets()和scanf()函数的区别
    EOF
  • 原文地址:https://www.cnblogs.com/fanguangdexiaoyuer/p/10692840.html
Copyright © 2020-2023  润新知