J2SE 1.5 引入的註解機制讓開發者能在原始碼中嵌入元數據。本文將示範如何定義自訂註解、在運行時透過反射提取註解資訊,並說明關鍵的保留策略設定。
使用 @interface 關鍵字定義註解類型,成員以無參數方法形式宣告:
/** 使用者自訂標籤,含成員變數 */
@Retention(RetentionPolicy.RUNTIME) // 關鍵:指定運行時保留
public @interface MyTag {
String name();
int age();
}
public class TagTest {
@MyTag(name="MyTag", age=1)
public void test() { }
public static void main(String[] args) {
TagTest tt = new TagTest();
try {
// 取得 test 方法上的所有註解
Annotation[] annotations = tt.getClass().getMethod("test").getAnnotations();
for (Annotation tag : annotations) {
System.out.println("Tag is: " + tag);
System.out.println("tag.name() = " + ((MyTag)tag).name());
System.out.println("tag.age() = " + ((MyTag)tag).age());
}
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
}
若自訂註解未標註 @Retention(RetentionPolicy.RUNTIME),則該註解資訊**不會保留在類別檔中**,運行時透過反射無法獲取,上述程式將無任何輸出。三種保留策略:
SOURCE:僅原始碼階段保留,編譯後捨棄(如 @Override、@SuppressWarnings)。CLASS(預設):保留在 .class 檔,但 JVM 不載入,運行時不可見。RUNTIME:保留在 .class 檔並由 JVM 載入,運行時可透過反射讀取。Tag is: @tiger.annotation.MyTag(name=MyTag, age=1)
tag.name() MyTag
tag.age() 1
獲取註解資訊後,可用於:
更多細節請參考官方文件:Java SE 1.5 Annotations Guide。