摘要:
本文針對java初學者或者annotation初次使用者全面地說明了annotation的使 用方法、定義方式、分類。初學者可以通過以上的說明製作簡單的annotation程 序,但是對於一些進階的annotation應用(例如使用自訂annotation產生 javabean映射xml檔案)還需要進一步的研究和探討。涉及到深入annotation的內 容,作者將在後文《Java Annotation進階應用程式》中談到。
同時,annotation運行存在兩種方式:運行時、編譯時間。上文中討論的都是在 運行時的annotation應用,但在編譯時間的annotation應用還沒有涉及,
一、為什麼使用Annotation:
在JAVA應用中,我們常遇到一些需要使用模版代碼。例如,為了編寫一個JAX -RPC web service,我們必須提供一對介面和實現作為模版代碼。如果使用 annotation對遠端存取的方法代碼進行修飾的話,這個模版就能夠使用工具自動 產生。
另 外,一些API需要使用與程式碼同時維護的附屬檔案。例如,JavaBeans 需要一個BeanInfo Class與一個Bean同時使用/維護,而EJB則同樣需要一個部署 描述符。此時在程式中使用annotation來維護這些附屬檔案的資訊將十分便利而 且減少了錯誤。
二、Annotation工作方式:
在5.0 版之前的Java平台已經具有了一些ad hoc annotation機制。比如,使 用transient修飾符來標識一個成員變數在序列化子系統中應被忽略。而 @deprecated這個 javadoc tag也是一個ad hoc annotation用來說明一個方法已 過時。從Java5.0版發布以來,5.0平台提供了一個正式的annotation功能:允許 開發人員定義、使用自己的annoatation類型。此功能由一個定義annotation類型的 文法和一個描述annotation聲明的文法,讀取annotaion 的API,一個使用 annotation修飾的class檔案,一個annotation處理工具(apt)組成。
annotation並不直接影響代碼語義,但是它能夠工作的方式被看作類似程式的 工具或者類庫,它會反過來對正在啟動並執行程式語義有所影響。annotation可以從 源檔案、class檔案或者以在運行時反射的多種方式被讀取。
當然annotation在某種程度上使javadoc tag更加完整。一般情況下,如果這 個標記對java文檔產生影響或者用於產生java文檔的話,它應該作為一個javadoc tag;否則將作為一個annotation。
三、Annotation使用方法:
1。型別宣告方式:
通常,應用程式並不是必須定義annotation類型,但是定義annotation類型並 非難事。Annotation型別宣告於一般的介面聲明極為類似,區別只在於它在 interface關鍵字前面使用“@”符號。
annotation 類型的每個方法聲明定義了一個annotation類型成員,但方法聲 明不必有參數或者異常聲明;方法傳回值的類型被限制在以下的範圍: primitives、String、Class、enums、annotation和前面類型的數組;方法可以 有預設值。
下面是一個簡單的annotation型別宣告:
清單1:
/**
* Describes the Request-For-Enhancement(RFE) that led
* to the presence of the annotated API element.
*/
public @interface RequestForEnhancement {
int id();
String synopsis();
String engineer() default "[unassigned]";
String date(); default "[unimplemented]";
}
代碼中只定義了一個annotation類型RequestForEnhancement。