自定義註解開發 1.開發一個註解類 開發一個註解類的過程,非常類似於開發一個介面,只不過需要通過@interface關鍵字來聲明 2.使用元註解修飾註解的聲明 所謂的原註解是用來修飾註解聲明的註釋,可以控制被修飾的註解的特性。 @Target 用來聲明被修飾的註解可以用在什麼位置。 可以在@Targ ...
自定義註解開發
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 }