首頁/ 汽車/ 正文

JAVA中的註解可以繼承嗎?

前言

註解想必大家都用過,也叫元資料,是一種程式碼級別的註釋,可以對類或者方法等元素做標記說明,比如Spring框架中的@Service,@Component等。那麼今天我想問大家的是類被繼承了,註解能否繼承呢?可能會和大家想的不一樣,感興趣的可以往下看。

簡單註解繼承演示

我們不妨來驗證下註解的繼承。

自定義一個註解

@Target({ElementType。METHOD, ElementType。TYPE})@Retention(RetentionPolicy。RUNTIME)public @interface TestAnnotation { String value();}複製程式碼

註解可以被標記在類或者方法上

使用自定義註解

@TestAnnotation(value = “Class”)static class Parent { @TestAnnotation(value = “Method”) public void method() { }}static class Child extends Parent { @Override public void method() { }}複製程式碼

Parent類和裡面的方法使用了註解

Child類繼承了Parent類, 重寫了父類的方法

驗證是否存在註解

public static void main(String[] args) throws NoSuchMethodException { Parent parent = new Parent(); log。info(“ParentClass: {}”, getAnnoValue(parent。getClass()。getAnnotation(TestAnnotation。class))); log。info(“ParentMethod: {}”, getAnnoValue(parent。getClass()。getMethod(“method”)。getAnnotation(TestAnnotation。class))); Child child = new Child(); log。info(“ChildClass: {}”, getAnnoValue(child。getClass()。getAnnotation(TestAnnotation。class))); log。info(“ChildMethod: {}”, getAnnoValue(child。getClass()。getMethod(“method”)。getAnnotation(TestAnnotation。class))); } private static String getAnnoValue(TestAnnotation annotation) { if(annotation == null) { return “未找到註解”; } return annotation。value(); }複製程式碼

輸出結果如下:

JAVA中的註解可以繼承嗎?

可以看到,父類的類和方法上的註解都可以正確獲得,但是子類的類和方法卻不能。這說明,

預設情況下,子類以及子類的方法,無法自動繼承父類和父類方法上的註解。

使用@Inherited演示

查了網上資料以後,在註解上標記@Inherited元註解可以實現註解的繼承。那麼,把@TestAnnotation註解標記了@Inherited,就可以一鍵解決問題了嗎?

JAVA中的註解可以繼承嗎?

重新執行,得到結果如下:

JAVA中的註解可以繼承嗎?

可以看到,子類可以獲得父類類上的註解;子類方法雖然是重寫父類方法,並且註解本身也支援繼承,但還是無法獲得方法上的註解。

如何重寫方法繼承註解?

實際上,@Inherited只能實現類上的註解繼承。要想實現方法上註解的繼承,你可以透過反射在繼承鏈上找到方法上的註解。是不是聽起來很麻煩,好在Spring框架中提供了AnnotatedElementUtils類,來方便我們處理註解的繼承問題。

呼叫AnnotatedElementUtils的findMergedAnnotation()方法,可以幫助我們找出父類和介面、父類方法和介面方法上的註解,實現一鍵找到繼承鏈的註解:

JAVA中的註解可以繼承嗎?

輸出結果如下圖:

JAVA中的註解可以繼承嗎?

總結

自定義註解可以透過標記元註解@Inherited實現註解的繼承,不過這隻適用於類。如果要繼承定義在介面或方法上的註解,可以使用Spring的工具類AnnotatedElementUtils。

相關文章

頂部