Java註解Annotation(一)——簡介java
這一章首先簡單介紹一下註解,下一章會給出一個註解應用的DEMO。數組
元註解的做用是負責註解其餘的註解。工具
JDK1.5中,定義了4個標準的meta-annotation元註解類型,他們被用來提供對其它annotation註解類型做說明。spa
這些類型和它們所支持的類在java.lang.annotation包中能夠找到。code
@Target說明了Annotation所修飾的對象範圍。Annotation可被用於packages,types(類,接口,枚舉,Annotation類型等),類型成員(方法,構造方法,成員變量,枚舉值),方法參數和本地變量(如循環變量,catch參數)。在Annotation類型的聲明中使用了target可更加明晰其修飾的目標。對象
做用:用於描述註解的使用範圍,即被描述的註解能夠用在什麼地方。blog
取值(ElementType):繼承
1. CONSTRUCTOR,用於描述構造器接口
2. FIELD:用於描述域生命週期
3. LOCAL_VARIABLE:用於描述局部變量
4. METHOD:用於描述方法
5.PACKAGE:用於描述包
6. PARAMETER:用於描述參數
7. TYPE:用於描述類,接口或枚舉等類型
@Retention定義了該Annotation註解被保留的時間擦汗你高端,某些Annotation僅出如今源碼中,而被編譯器丟棄,而另外一些卻被編譯在class文件中;編譯在class文件中的Annotation可能會被虛擬機忽略,而另外一些在class被裝載時將被讀取(請注意並不影響class的執行,由於Annotation與class在使用上是被分離的)。
做用:表示須要在什麼級別保存該註釋信息,用於描述註解的生命週期,即被描述的註解在什麼範圍內有效。
取值(RetentionPoicy):
1. SOURCE:在源文件中有效
2. CLASS:在class文件中有效
3. RUNTIME:在運行時有效
註解的RetentionPolicy的屬性值是RUNTIME,這樣註解處理器能夠經過反射,獲取到該註解的屬性值,從而去作一些運行時的邏輯處理。
@Documented用於描述其它類型的annotation應該被做爲被標註的程序成員的公共API,所以能夠被例如javadoc此類的工具文檔化。Documented是一個標記註解,沒有成員。
@Inherited元註解是一個標記註解,@Inherited闡述了某個被標註的類型是被繼承的,註解類型被自動繼承。若是一個使用了@Inherited修飾的annotation類型被用於一個class,則這個annotation將被用於該class的子類
注意:@Inherited annotation類型是被標註過的class的子類所繼承。類並不從它所實現的接口繼承annotation,方法並不從它所重載的方法繼承annotatiaon。
使用@interface自定義註解時,自動集成了java.lang.annotation.Annotation接口,由編譯程序自動完成其餘細節。在定義註解時,不能繼承其餘的註解或接口。@interface用來聲明一個註解,其中的沒一個方法其實是聲明瞭一個配置參數。方法的名稱就是參數的名稱,返回值類型就是參數的類型。能夠經過default來聲明參數的默認值。
@Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interfaces Demo { public String value() default "demo"; }
上面的代碼,說明了@Demo這個自定義註解在使用的時候,只能註解FIELD,即類的屬性,只能在運行時纔會起做用。其中註解中的方法默認會返回字符串"demo"。
註解元素必須有肯定的值,要麼在定義註解的默認值中指定,要麼在使用註解時指定,非基本類型的註解元素的值不可爲null。所以,使用空字符串或0做爲默認值是一種經常使用的作法。這個約束使得處理器很難表現一個元素的存在或者缺失的炸ungtai,由於每一個註解的聲明中,全部元素都存在,而且都具備相應的值,爲了繞開這個約束,咱們只能定義一些特殊的值,例如空字符串或者負數,一次表示某個元素不存在,在定義註解時,這已經成爲一個習慣用法。
在聲明瞭註解hiro,咱們要對註解註釋的方法進行處理。
註解處理器類庫:
java.lang.reflect.AnnotatedElement