1. 程式人生 > >關於註解繼承性的一個例子

關於註解繼承性的一個例子

span 收藏 UC string OS san blog throws java

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

子類可以繼承到父類上的註解嗎?

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

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

測試環境如下:

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

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

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

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

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

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

MyAnnotation自定義註解

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

Java代碼 技術分享圖片
  1. package test.annotation;
  2. import java.lang.annotation.Inherited;
  3. import java.lang.annotation.Retention;
  4. /**
  5. * 自定義註解
  6. */
  7. //@Inherited //可以被繼承
  8. @Retention (java.lang.annotation.RetentionPolicy.RUNTIME) //可以通過反射讀取註解
  9. public @interface MyAnnotation {
  10. String value();
  11. }

父類

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

Java代碼 技術分享圖片
  1. package test.annotation;
  2. @MyAnnotation (value = "類名上的註解" )
  3. public abstract class ParentClass {
  4. @MyAnnotation (value = "父類的abstractMethod方法" )
  5. public abstract void abstractMethod();
  6. @MyAnnotation (value = "父類的doExtends方法" )
  7. public void doExtends() {
  8. System.out.println(" ParentClass doExtends ..." );
  9. }
  10. @MyAnnotation (value = "父類的doHandle方法" )
  11. public void doHandle(){
  12. System.out.println(" ParentClass doHandle ..." );
  13. }
  14. }

子類

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

Java代碼 技術分享圖片
  1. package test.annotation;
  2. public class SubClass extends ParentClass{
  3. //子類實現父類的抽象方法
  4. @Override
  5. public void abstractMethod() {
  6. System.out.println("子類實現父類的abstractMethod抽象方法" );
  7. }
  8. //子類繼承父類的doExtends方法
  9. //子類覆蓋父類的doHandle方法
  10. @Override
  11. public void doHandle(){
  12. System.out.println("子類覆蓋父類的doHandle方法" );
  13. }
  14. }

測試類

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

Java代碼 技術分享圖片
  1. package test.annotation;
  2. import java.lang.reflect.Method;
  3. public class MainTest {
  4. public static void main(String[] args) throws SecurityException,
  5. NoSuchMethodException {
  6. Class<SubClass> clazz = SubClass.class ;
  7. if (clazz.isAnnotationPresent(MyAnnotation. class )) {
  8. MyAnnotation cla = clazz
  9. .getAnnotation(MyAnnotation.class );
  10. System.out.println("子類繼承到父類類上Annotation,其信息如下:" +cla.value());
  11. } else {
  12. System.out.println("子類沒有繼承到父類類上Annotation" );
  13. }
  14. // 實現抽象方法測試
  15. Method method = clazz.getMethod("abstractMethod" , new Class[] {});
  16. if (method.isAnnotationPresent(MyAnnotation. class )) {
  17. MyAnnotation ma = method
  18. .getAnnotation(MyAnnotation.class );
  19. System.out.println("子類實現父類的abstractMethod抽象方法,繼承到父類抽象方法中的Annotation,其信息如下:" +ma.value());
  20. } else {
  21. System.out.println("子類實現父類的abstractMethod抽象方法,沒有繼承到父類抽象方法中的Annotation" );
  22. }
  23. //覆蓋測試
  24. Method methodOverride = clazz.getMethod("doExtends" , new Class[] {});
  25. if (methodOverride.isAnnotationPresent(MyAnnotation. class )) {
  26. MyAnnotation ma = methodOverride
  27. .getAnnotation(MyAnnotation.class );
  28. System.out
  29. .println("子類繼承父類的doExtends方法,繼承到父類doExtends方法中的Annotation,其信息如下:" +ma.value());
  30. } else {
  31. System.out.println("子類繼承父類的doExtends方法,沒有繼承到父類doExtends方法中的Annotation" );
  32. }
  33. //繼承測試
  34. Method method3 = clazz.getMethod("doHandle" , new Class[] {});
  35. if (method3.isAnnotationPresent(MyAnnotation. class )) {
  36. MyAnnotation ma = method3
  37. .getAnnotation(MyAnnotation.class );
  38. System.out
  39. .println("子類覆蓋父類的doHandle方法,繼承到父類doHandle方法中的Annotation,其信息如下:" +ma.value());
  40. } else {
  41. System.out.println("子類覆蓋父類的doHandle方法,沒有繼承到父類doHandle方法中的Annotation" );
  42. }
  43. }
  44. }

編寫自定義註解時未寫@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 只是可控制 對類名上註解是否可以被繼承。不能控制方法上的註解是否可以被繼承。

關於註解繼承性的一個例子