自定義註解類編寫的一些規則:
1. Annotation型定義爲@interface, 所有的Annotation會自動繼承java.lang.Annotation這一接口,並且不能再去繼承別的類或是接口.
2. 參數成員只能用public或默認(default)這兩個訪問權修飾
3. 參數成員只能用基本類型byte,short,char,int,long,float,double,boolean八種基本數據類型和String、Enum、Class、annotations等數據類型,以及這一些類型的數組.
4. 要獲取類方法和字段的註解信息,必須通過Java的反射技術來獲取 Annotation對象,因爲你除此之外沒有別的獲取註解對象的方法
5. 註解也可以沒有定義成員, 不過這樣註解就沒啥用了
自定義註解類時, 可以指定目標 (類、方法、字段, 構造函數等) , 註解的生命週期(運行時,class文件或者源碼中有效), 是否將註解包含在javadoc中及是否允許子類繼承父類中的註解, 具體如下:
1. @Target 表示該註解目標,可能的 ElemenetType 參數包括:
ElemenetType.CONSTRUCTOR 構造器聲明
ElemenetType.FIELD 域聲明(包括 enum 實例)
ElemenetType.LOCAL_VARIABLE 局部變量聲明
ElemenetType.METHOD 方法聲明
ElemenetType.PACKAGE 包聲明
ElemenetType.PARAMETER 參數聲明
ElemenetType.TYPE 類,接口(包括註解類型)或enum聲明
2. @Retention 表示該註解的生命週期,可選的 RetentionPolicy 參數包括
RetentionPolicy.SOURCE 註解將被編譯器丟棄
RetentionPolicy.CLASS 註解在class文件中可用,但會被VM丟棄
RetentionPolicy.RUNTIME VM將在運行期也保留註釋,因此可以通過反射機制讀取註解的信息
3. @Documented 指示將此註解包含在 javadoc 中
4. @Inherited 指示允許子承父類中的註解
這裏有四種類型的元註解:
1. @Documented —— 指明擁有這個註解的元素可以被javadoc此類的工具文檔化。這種類型應該用於註解那些影響客戶使用帶註釋的元素聲明的類型。如果一種聲明使用Documented進行註解,這種類型的註解被作爲被標註的程序成員的公共API。
2. @Target——指明該類型的註解可以註解的程序元素的範圍。該元註解的取值可以爲TYPE,METHOD,CONSTRUCTOR,FIELD等。如果Target元註解沒有出現,那麼定義的註解可以應用於程序的任何元素。
3. @Inherited——指明該註解類型被自動繼承。如果用戶在當前類中查詢這個元註解類型並且當前類的聲明中不包含這個元註解類型,那麼也將自動查詢當前類的父類是否存在Inherited元註解,這個動作將被重複執行知道這個標註類型被找到,或者是查詢到頂層的父類。
4.@Retention——指明瞭該Annotation被保留的時間長短。RetentionPolicy取值爲SOURCE,CLASS,RUNTIME。
Java內建註解
Java提供了三種內建註解。
1. @Override——當我們想要複寫父類中的方法時,我們需要使用該註解去告知編譯器我們想要複寫這個方法。這樣一來當父類中的方法移除或者發生更改時編譯器將提示錯誤信息。
2. @Deprecated——當我們希望編譯器知道某一方法不建議使用時,我們應該使用這個註解。Java在javadoc 中推薦使用該註解,我們應該提供爲什麼該方法不推薦使用以及替代的方法。
3. @SuppressWarnings——這個僅僅是告訴編譯器忽略特定的警告信息,例如在泛型中使用原生數據類型。它的保留策略是SOURCE(譯者注:在源文件中有效)並且被編譯器丟棄。