標籤:doc out system lang 反射 void image 成員變數 預設值
一、 什麼是註解(Annotation)?
1. 概念:
Annotation是代碼裡的特殊標記,這些標記可以在編譯、類載入、運行時被讀取,並執行相應的處理。通過使用注釋,程式開發人員可以可以在不改變原有邏輯的情況下,在源檔案中嵌入一些補充的資訊。
2. 作用:
1)不是程式本身,可以對程式做出解釋
2)可以被其他程式讀取
3. 格式
註解是以“@注釋名”在代碼中存在的,還可以添加一些參數值,例如:@SuppressWarnings(value="unchecked");
4. Annotation在哪裡使用?
可用於包、類、構造器、方法、成員變數、參數、局部變數的聲明,相當於給它們添加額外的資訊,我們可以通過反射機制編程實現對中繼資料的訪問
二、基本Annotation,5個基本Annotation都在java.lang包下
1) @Override :此注釋只適用於修飾方法,表示一個方法聲明打算重寫超類中另一個方法的聲明;
2) @Deprecated: 用於表示某個程式元素(類、方法等)已淘汰,當其他程式使用已淘汰的類、方法時,編譯器將會給出警告。表示不鼓勵程式員使用給類、方法。
3) @SuppressWarnings:指示被該Annotation修飾的程式元素(要以及該程式元素的所有子項目)取消顯示指定的編譯器警告。抑制編譯時間的警告資訊。與前兩個注釋有所不同,需要添加一個參數才能正確使用,這些參數已經定義好了,我們選擇就可以,參數如下:
4) @SafeVarargs:Java7中的“堆汙染”,修飾引發給警告的方法或構造器,類抑制“堆汙染”警告;
堆汙染:當把一個不帶泛型的對象賦給一個帶泛型的得變數時,往往會發生這種“堆汙染”
5) @FunctionallInterface:Java8中規定,如果介面中只有一個抽象方法,該介面就是函數式介面。@FunctionallInterface就是用來指定某個介面必須是函數式介面。
三、自訂Annotation
1. @interface用來聲明一個註解
格式為:public @interface 註解名 {定義體}
2. 其中每一個方法實際上是聲明了一個配置參數
1)方法名稱就是參數名稱
2)傳回值類型就是參數的類型(傳回值類型只能是基本類型、String、Class、enum)
3)可以通過default來聲明參數的預設值(預設值為-1時,表示該參數不存在)
4)如果只有一個參數成員,一般參數名為value
@Retention(value=RetentionPolicy.RUNTIME)@Target(value={ElementType.METHOD,ElementType.TYPE})public @interface MyAnnotation { String name() default " "; int age() default 0; int id() default -1; //不存在}
3. JDK的元註解:用於修飾其他的Annotation定義。作用:負責註解其他註解
1)@Retention:用於指定被修飾的Annotation可以保留多長時間,@Retention包含了一個RetentionPolicy類型的value參數配置,所以使用@Retention時必須為該value參數指定值;
[email protected](RetentionPolicy.SOURCE):將被編譯器直接丟棄
2)@Target:用於指定被修飾的Annotation能用於修飾哪些程式單元,也就是註解的適用範圍;@Target包含了一個ElementType類型的value參數配置,所以使用@Target時必須為該value參數指定值;
[email protected](ElementType.FIELD):只能修飾成員變數
3)@Documented:用於指定被該元Annotation修飾的Annotation類將被javadoc工具提取成文檔,如果定義Annotation類時使用了@Documentedx修飾,則所有使用該Annotation修飾的程式元素的API文檔中將會包含該Annotation說明;
4)@Inherited:指定被它修飾的Annotation將具有繼承性---如果某個類使用了@Xxx註解(定義該註解時使用了@Inherited修飾)修飾,則其子類將自動被@Xxx修飾。
4. 使用反射讀取註解的資訊:使用註解完成類和表結構的映射關係
1)表名的註解
@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)public @interface MyTable { String value();}
2)屬性的註解
@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.FIELD)public @interface MyField { String columnName(); String type(); int length();}
3)使用反射讀取註解
1 public class Demo03 { 2 public static void main(String[] args) { 3 try { 4 Class clzz = Class.forName("com.java.annotation.MyStudent"); 5 //擷取該類所有的註解 6 Annotation[] annotations = clzz.getAnnotations(); 7 for(Annotation a :annotations) { 8 System.out.println(a); 9 }10 //擷取該類指定的註解11 MyTable mb = (MyTable) clzz.getAnnotation(MyTable.class);12 System.out.println(mb.value());13 14 //擷取類的屬性的註解15 Field f = clzz.getDeclaredField("id");16 MyField myfield = f.getAnnotation(MyField.class);17 System.out.println(myfield.columnName()+"---"+myfield.type()+"---"+myfield.length());18 19 } catch (Exception e) {20 e.printStackTrace();21 }22 }23 }
Java學習之註解Annotation