標籤:
註解相當於一種標記,在程式中加了註解就等於為程式打上了某種標記,沒加,則等於沒有某種標記,以後,javac編譯器,開發工具和其他程式可以用反射來瞭解你的類及各種元素上有無何種標記,看你有什麼標記,就去幹相應的事。標記可以加在包,類,欄位,方法,方法的參數以及局部變數上。
自訂註解及其應用1)、定義一個最簡單的註解
public @interface MyAnnotation { //......}
2)、把註解加在某個類上:
@MyAnnotationpublic class AnnotationTest{ //......}
Java中提供了四種元註解,專門負責註解其他的註解,分別如下:
@Retention元註解,表示需要在什麼層級儲存該注釋資訊(生命週期)。可選的RetentionPoicy參數包括:
RetentionPolicy.SOURCE: 停留在java源檔案,編譯器被丟掉
RetentionPolicy.CLASS:停留在class檔案中,但會被VM丟棄(預設)
RetentionPolicy.RUNTIME:記憶體中的位元組碼,VM將在運行時也保留註解,因此可以通過反射機制讀取註解的資訊
@Target元註解,預設值為任何元素,表示該註解用於什麼地方。可用的ElementType參數包括
ElementType.CONSTRUCTOR: 構造器聲明
ElementType.FIELD: 成員變數、對象、屬性(包括enum執行個體)
ElementType.LOCAL_VARIABLE: 局部變數聲明
ElementType.METHOD: 方法聲明
ElementType.PACKAGE: 包聲明
ElementType.PARAMETER: 參數聲明
ElementType.TYPE: 類、介面(包括註解類型)或enum聲明
@Documented註解將註解包含在JavaDoc中
@Inheried註解允許子類繼承父類中的註解
以下寫了一個類比註解的案例:
首先寫一個自訂註解@MyAnnotation,代碼如下所示:
package com.pcict.anotation.test;import java.lang.annotation.*;@Retention(RetentionPolicy.RUNTIME)@Target({ ElementType.METHOD, ElementType.TYPE })public @interface MyAnnotation { // 為註解添加屬性 String color(); String value() default "我是XXX"; // 為屬性提供預設值 int[] array() default { 1, 2, 3 }; Gender gender() default Gender.MAN; // 添加一個枚舉 // 添加枚舉屬性 MetaAnnotation metaAnnotation() default @MetaAnnotation(birthday = "我的出身日期為1988-2-18");}
寫一個枚舉類Gender,類比註解中添加枚舉屬性,代碼如下所示:
package com.pcict.anotation.test;public enum Gender { MAN { public String getName() { return "男"; } }, WOMEN { public String getName() { return "女"; } }; // 後面記得有“;” public abstract String getName();}
寫一個註解類MetaAnnotation,類比註解中添加註解屬性,代碼如下:
package com.pcict.anotation.test;public @interface MetaAnnotation { String birthday();}
最後寫註解測試類別AnnotationTest,代碼如下:
package com.pcict.anotation.test;// 調用註解並賦值@MyAnnotation(metaAnnotation = @MetaAnnotation(birthday = "我的出身日期為1988-2-18"), color = "red", array = { 23, 26 })public class AnnotationTest { public static void main(String[] args) { // 檢查類AnnotationTest是否含有@MyAnnotation註解 if (AnnotationTest.class.isAnnotationPresent(MyAnnotation.class)) { // 若存在就擷取註解 MyAnnotation annotation = (MyAnnotation) AnnotationTest.class .getAnnotation(MyAnnotation.class); System.out.println(annotation); // 擷取註解屬性 System.out.println(annotation.color()); System.out.println(annotation.value()); // 數組 int[] arrs = annotation.array(); for (int arr : arrs) { System.out.println(arr); } // 枚舉 Gender gender = annotation.gender(); System.out.println("性別為:" + gender); // 擷取註解屬性 MetaAnnotation meta = annotation.metaAnnotation(); System.out.println(meta.birthday()); } }}
運行AnnotationTest,輸出結果為:
Java自訂註解Annotation詳解