父類上的注解能被子類繼承嗎


父類上的注解可以被子類繼承嗎?

轉載自:http://wzhw2008.iteye.com/blog/1723136

-----------------------------------------------------------------

我們知道在編寫自定義注解時,可以通過指定@Inherited注解,指明自定義注解是否可以被繼承。但實現情況又可細分為多種。

 

測試環境如下:

-----------------------------------------------------------------

父類的類上和方法上有自定義的注解--MyAnnotation

子類繼承了這個父類,分別:

子類方法,實現了父類上的抽象方法

子類方法,繼承了父類上的方法

子類方法,覆蓋了父類上的方法

 

 

MyAnnotation自定義注解

-----------------------------------------------------------------

Java代碼   收藏代碼
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();    
}   

父類

-----------------------------------------------------------------

Java代碼   收藏代碼
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 ..." );  
    }  
}  

子類

-----------------------------------------------------------------

Java代碼   收藏代碼
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方法" );   
    }  
}   

 

測試類

-----------------------------------------------------------------

Java代碼   收藏代碼
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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM