2.3.1動態查找注釋
當我們定義好了注釋以後,我們可以開發一些分析工具來解釋這些注釋。這裡通常要 用到Java的反射特性。比如說我們希望找到某個對象/方法/域使用了哪些注釋,或者獲得 某個特定的注釋,或者判斷是否使用某個特定的注釋, 我們可以參考下面這個例子。這個 例子中定義了兩個注釋:TODO和TOFORMATE。在MyCalculator類中,TODO用來修飾方法 calculateRate,而TOFORMATE用來修飾類變量concurrency和debitDate。而在類 TestCalculator的main函數中,通過Java反射特性,我們查找到使用這些注釋的類變量和 方法。清單12-清單15分別顯示這些類的定義。
清單12 TODO注釋的定義
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface TODO {
int priority() default 0;
}
清單13 TOFORMATE的定義
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface TOFORMATE {
}
清單14 使用注釋的類MyCalculator
public class MyCalculator {
boolean isReady;
@TOFORMATE double concurrency;
@TOFORMATE Date debitDate;
public MyCalculator() {
super();
}
@TODO
public void calculateRate(){
System.out.println("Calculating...");
}
}
清單15動態查找注釋
public class TestCalculator {
public static void main(String[] args) {
MyCalculator cal = new MyCalculator();
cal.calculateRate();
try {
Class c = cal.getClass();
Method[] methods = c.getDeclaredMethods();
for (Method m: methods) {
// 判斷這個方法有沒有使用TODO
if (m.isAnnotationPresent(TODO.class))
System.out.println("Method "+m.getName()+": the TODO is present");
}
Field[] fields = c.getDeclaredFIElds();
for (Field f : fIElds) {
// 判斷這個域有沒有使用TOFORMATE
if (f.isAnnotationPresent(TOFORMATE.class))
System.out.println("FIEld "+f.getName()+": the TOFORMATE is present");
}
} catch (Exception exc) {
exc.printStackTrace();
}
}
}
下面我們來運行這個例子,這個例子的運行結果如圖10所示。
運行結果和我們先前的定義是一致的。在運行時,我們可以獲得注釋使用的相關信息 。
圖6 運行結果
在我們介紹了什麼是注釋以後,你可能會想知道注釋可以應用到什麼地方呢?使用注 釋有什麼好處呢?在下面的小節中我們將介紹一個稍復雜的例子。從這個例子中,你將體 會到注釋所以提供的強大的描述機制(declarative programming)。