自定義註解開發java
1.開發一個註解類數組
開發一個註解類的過程,很是相似於開發一個接口,只不過須要經過@interface關鍵字來聲明工具
2.使用元註解修飾註解的聲明spa
所謂的原註解是用來修飾註解聲明的註釋,能夠控制被修飾的註解的特性。code
@Targetblog
用來聲明被修飾的註解能夠用在什麼位置。繼承
能夠在@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 }