Q:如何使用 Annotation ?
A:首先讓我們從 Java 定義的 Annotation 開始。@Override 可能是我們最常用到的 Annotation 之一了,Eclipse 中當子類中的某個方法覆寫的父類中的方法時,會亮黃燈提示。若用 @Override 修飾該方法,黃燈熄滅。再讓我們來看一個例子,當我們使用 new Java.util.Date(2010, 2, 25); 來初始化日期類時,Eclipse 仍然會亮黃燈提示,這是因為該方法被 @Deprecated 修飾了,表示不推薦使用。從這兩個例子我們能夠了解到,Annotation 是在編譯期校驗的。這一點最大的好處是在編譯期間就可對錯誤進行處理。若使用 XML 的話,只有在運行期才能得到錯誤信息。
Q:Java 標准的 Annotation 有哪些?
A:@Deprecated 相當於Javadoc的@deprecated,被@Deprecated標注的對象class, method等被注明為不推薦使用。主要用於Javac等編譯工具。
@Override 注明對象method重載了父類的方法。Javac等編譯工具編譯時會根據此Annotation判斷重載方法是否正確。
@SuppressWarnings 告訴Javac等編譯器忽略所指定的特定的警告信息。
@Target 被定義的annotation可以附加在那些對象上。
@Retention annotation的作用期間。
這裡我們要重點介紹兩個 Annotation ,因為這兩個 Annotation 有一點特殊,因為它們並不是用來修飾代碼,而是用來修飾 Annotation 的。
@Target 用來標注定義的 Annotation 可以附加在那些對象上。可選參數包括CONSTRUCTOR(構造器)、FIELD(屬性及enum實例)LOCAL_VARIABLE(局部變量)、METHOD(方法)、PACKAGE(包)、PARAMETER(參數)以及TYPE(類、接口、注解類型、enum)。下例定義的 Annotation 被 @Target 修飾,表示該 Annotation 可以用來修飾屬性和參數。
@Target( { FIELD, PARAMETER}) public @interface Resource { public String id() default ""; }
使用方法:
public class Mxjava { @Resource(id="http://www.mxJava.com") private String url; public void getLog(@Resource(id="001") String logId) {...} }
@Retention 用標注在什麼級別保存該 Annotation 。可選參數包括SOURCE(編譯期會被忽略不做保存)、CLASS(編譯後的 class 文件中可用,但虛擬機運行時忽略)、RUNTIME(運行期保留,若要使用反射機制讀取 Annotation 信息的話,使用該項。)
@Target( { FIELD, PARAMETER}) @Retention(RUNTIME) public @interface Resource { public String id() default ""; }
Q:如何定義 Annotation ?
A:先讓我們來看一個最簡單的 Annotation 。
@Target( { FIELD }) @Retention(RUNTIME) public @interface Resource { public String id() default ""; }
@Target 是 Java 標准的 Annotation,本例中指定定義的 Annotation 可以附加在屬性(FIEld)上。@Retention 也是 Java 標准的 Annotation,指定作用期間是運行期。@interface 是用來修飾 Annotation 的,請注意,它不是 interface。這個關鍵字聲明隱含了一個信息:它是繼承了 Java.lang.annotation.Annotation 接口,而不是聲明了一個 interface。Annotation 成員的定義看上去很象方法,default “” 表示默認值為空字符串。使用方法如下:
public class mxjava { @Resource(id="http://www.mxJava.com") private String url; }
若沒有配套的框架和工具,@Resource 是不起任何作用的。就象前面講到的那樣,它不會對代碼的執行有任何影響。
Q:什麼時候需要自定義 Annotation ?
A:一般來說,若不做框架和工具的開發,一般情況下是不需要自定義 Annotation 的。