自定義註解開發
1.開發一個註解類
開發一個註解類的過程,非常類似於開發一個介面,只不過需要通過@interface關鍵字來宣告
2.使用元註解修飾註解的宣告
所謂的原註解是用來修飾註解宣告的註釋,可以控制被修飾的註解的特性。
@Target
用來宣告被修飾的註解可以用在什麼位置。
可以在@Target的屬性中設定Element Type型別的陣列來指定可以使用的位置。
如果不使用此原註解修飾,預設註解可以用在任意位置。
@Retention
用來宣告被修飾的註釋會被保留到什麼階段。
可以在該註解的屬性中通過RetentionPolicy型別的值來指定註釋被保留到何時。
(1)RetentionPolicy.SOURCE
此註解將會被保留到原始碼階段,java中,在編譯過程中被刪除。
這種型別的註解通常是給編譯器看的。
(2)Retention Policy.CLASS
此註解將會被保留到原始碼階段和編譯階段,.java和.class中,在類載入的過程中被刪除。
這種型別的註解通常是給類載入器看的。
(3)RetentionPolicy.RUNTIME
此註解將會被保留在原始碼階段、編譯階段和執行階段,.java .class和記憶體中的位元組碼中都會存在。
這種型別的註解通常在執行階段進行反射,控制程式執行過程。
***只有RUNTIME級別的註解才可以通過反射技術進行反射。
@Documented
用來宣告被修飾註解是否要被文件提取工具提取到文件中。
預設不提取
@Inherited
被修飾的註釋是否具有繼承性
預設沒有繼承性
3.為註解增加屬性
註解類中還可以有宣告屬性。
為註解類宣告屬性的過程非常類似於介面定義方法。
但要求,註解中的所有的屬性必須是public的,可以顯式宣告,也可以不宣告,不宣告預設就是public的。
註解中的屬性只能是八種基本資料型別、String型別、Class型別、其他註解型別及以上型別的一維陣列。
註解中宣告的屬性 需要在使用註解時,為其賦值,賦值的方式就是在使用註解時,在註解後跟上一對小括號,在括號中通過 屬性名=屬性值 的方式指定屬性的值
也可以在宣告註解時,在註解的屬性後面通過default關鍵字,宣告屬性的預設值,這樣一來,使用註解時不賦值,將會使用default預設值,當然也可以手動賦值,覆蓋預設值。
如果屬性是一維陣列型別,在傳入的陣列中,只有一個值,則包括陣列的大括號也可以省略。
如果註解的屬性只有一個需要賦值,且該屬性的名稱叫做value,則在使用註解時,value==可以不寫
反射註解
1.反射註解的原理
RetentionPolicy.RUNTIME級別的註解會保留到執行中,可以通過反射技術獲取,從而可以根據是否有註解 或 註解屬性值的不同來控制程式按照不同方式執行。
以下反射相關的型別中都提供了反射註解的方法:
類Class<T>、類Method、類FIeld、類Constructor<T>、類Package
2.反射註解案例
1 package cn.tedu.test; 2 3 import java.lang.annotation.ElementType; 4 import java.lang.annotation.Retention; 5 import java.lang.annotation.RetentionPolicy; 6 import java.lang.annotation.Target; 7 8 @Target(ElementType.TYPE) 9 @Retention(RetentionPolicy.RUNTIME) 10 @interface level{ 11 String value(); 12 } 13 14 @level("刑警") 15 class Police{ 16 } 17 18 public class AnnoTest02 { 19 public static void main(String[] args) { 20 System.out.println("敬了個禮,您好,您超速了,罰款200元。。。"); 21 if(Police.class.isAnnotationPresent(level.class)){ 22 level anno = Police.class.getAnnotation(level.class); 23 if("協警".equals(anno.value())){ 24 System.out.println("哥們少罰點,50塊得了~~"); 25 }else if("交警".equals(anno.value())){ 26 System.out.println("哥們抽根菸,這是200塊,收好我走人~~"); 27 }else if("刑警".equals(anno.value())){ 28 System.out.println("趕緊交錢走人,別查出 別的事。。。"); 29 }else{ 30 System.out.println("xxx"); 31 } 32 }else{ 33 System.out.println("打一頓,扭送警察局。。"); 34 } 35 } 36 }