java註解通俗易懂系列教程二之自定義註解步驟

1.自定義註解

回顧一下官方提供的註解:Java 定義了一套註解,共有 7 個,3 個在 java.lang 中,剩下 4 個在 java.lang.annotation 中。

作用在代碼的註解是:

  • @Override - 檢查該方法是否是重載方法。如果發現其父類,或者是引用的接口中並沒有該方法時,會報編譯錯誤。
  • @Deprecated - 標記過時方法。如果使用該方法,會報編譯警告。
  • @SuppressWarnings - 指示編譯器去忽略註解中聲明的警告。

從 Java 7 開始,額外添加了 3 個註解:

  • @SafeVarargs - Java 7 開始支持,忽略任何使用參數爲泛型變量的方法或構造函數調用產生的警告。
  • @FunctionalInterface - Java 8 開始支持,標識一個匿名函數或函數式接口。
  • @Repeatable - Java 8 開始支持,標識某註解可以在同一個聲明上使用多次。

作用在其他註解的註解(或者說 元註解)是:(這個是官方提供寫自定義註解時使用的註解,製作自定義註解本期就使用這四個

  • @Retention - 標識這個註解怎麼保存,是隻在代碼中,還是編入class文件中,或者是在運行時可以通過反射訪問。
  • @Documented - 標記這些註解是否包含在用戶文檔中。
  • @Target - 標記這個註解應該是哪種 Java 成員。
  • @Inherited - 標記這個註解是繼承於哪個註解類(默認 註解並沒有繼承於任何子類)

其中target在java1.8的時候還引入兩個屬性上圖沒有

  • TYPE_PARAMETER 在【類型參數】上使用 Java 1.8 引入
  • TYPE_USE 在【任何聲明類型的地方】上使用 Java 1.8 引入)

2.知道官方提供的註解後,開始正式開始本期的自定義註解教程

整體步驟一共分爲三步:1.定義註解格式 2. 配置元註解 3.定義參數  4.定義註解邏輯

(1).定義註解格式

修飾符 @interface 註解名 {   
    註解元素的聲明1 
    註解元素的聲明2   
}

(2). 配置元註解

根據使用情況適當配置@Retention,@Documented,@Target,@Inherited這四個元註解

其中target在java1.8的時候還引入兩個屬性上圖沒有

  • TYPE_PARAMETER 在【類型參數】上使用 Java 1.8 引入
  • TYPE_USE 在【任何聲明類型的地方】上使用 Java 1.8 引入)

(3).定義參數

自定義的參數類型只能爲以下類型:

  • 所有的基本類型:byte、short、char、int、long、float、double
  • String類型
  • Class類型
  • enum類型
  • Annotation類型
  • 以上類型的數組

參數可以使用default 定義默認值,如下:

修飾符 @interface 註解名 {   
    String name() default "";
    註解元素的聲明2   
}

(4).定義註解邏輯(具體demo看下一篇教程)

這一步是最關鍵的,通過aop等方法(不一定非得aop,不過目前最多的就是aop)攔截註解前後,根據註解(通過反射獲取)的參數內容,在代碼前後執行特定的邏輯(這一步用到通過反射執行)。

總結:寫自定義註解:1.定義註解格式 2. 配置元註解 3.定義參數  4.定義註解邏輯前三步都好理解。第四步就是需要先確定代碼的執行範圍,然後攔截代碼並通過反射獲取註解的內容執行特定的代碼邏輯,再通過反射執行方法(常見的是aop+反射)。

補充問題:對於確定註解執行範圍有的不太理解,我怎麼預測註解會在哪裏執行?

答:你是寫這個自定義註解,你讓使用者在哪裏用,肯定就得只能在這個範圍。你是制定規則的人,誰萬一不遵守就不讓使用這個註解,想想你常用的註解,用錯地方了是不是會無效。所以執行範圍就是你代碼邏輯生效的地方,比如哪個包,哪個類才生效。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章