Java代碼
java
import java.lang.annotation.ElementType; import java.lang.annotation.Target; // The @Bind tag. @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface Bind { public String name(); public int time() default 0; }
以上是一個用於Method級的簡單的@Bind註解類,比較有點象接口的結構,事實上,與其它任何Java接口同樣,註解也將會編譯成class文件。
shell
/** * Use the @Bind tag. */ public class BindCase { @Bind(name="case", time=1) public void method(){ // do something.. } public void method1(){ // do something.. } @Bind(name="case1", time=20) public void method2(){ // do something.. } }
編寫註解處理器:
在 JASE 1.5擴展了了反射機制的API,爲咱們提供了相應的註解處理器的API,另外還能夠經過外部工具 apt 來解析帶有註解的Java Code.
api
public class BindCaseTracker{ private static Logger logger = Logger.getLogger(BindCaseTracker.class); public static void printBindCase(Class<?> bindClass){ assert bindClass != null; for (Method method : bindClass.getDeclaredMethods()){ Bind bind = method.getAnnotation(Bind.class); if (bind == null) continue; // Not found annotation. logger.debug(String.format("Found [%s] Bind Case : %s-%d", method .getName(), bind.name(), bind.time())); } } public static void main(String[] args) { BindCaseTracker.printBindCase(BindCase.class); } }
/* Output: [DEBUG] 11-08 14:15 Found [method] Bind Case : case-1 [DEBUG] 11-08 14:15 Found [method2] Bind Case : case1-20 *///~
在J2SE中內置了三種經常使用標準註解(Override, Deprecated, SuppressWarnings)以及四種元註解:
maven
@Target: 表示該註解能夠用於什麼地方。可用ElementType枚舉類型主要有: TYPE : 類、接口或enum聲明 FIELD: 域(屬性)聲明 METHOD: 方法聲明 PARAMETER: 參數聲明 CONSTRUCTOR: 構造方法聲明 LOCAL_VARIABLE:局部變量聲明 ANNOTATION_TYPE:註釋類型聲明 PACKAGE: 包聲明 @Retention: 表示須要在什麼級別保存該註解信息。可用RetentionPolicy枚舉類型主要有: SOURCE: 註解將被編譯器丟棄。 CLASS : 註解在class文件中可能。但會被VM丟棄。 RUNTIME: VM將在運行時也保存註解(若是須要經過反射讀取註解,則使用該值)。 @Documented: 將此註解包含在Javadoc中。 @Inherited: 容許子類繼承父類中的註解。
a. 若是但願定義的註解用於多種 ElementType 的話能夠寫成:
ide
import static java.lang.annotation.ElementType @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
b. 在聲明註解中的方法時可經過 default 來指定默認值。
c. 在聲明註解中的方法返回類型可結合泛型使用,如:
工具
Class<? extends Payload>[] payload() default {};
d. 可在註解類中定義嵌套註解,如:
spa
import static java.lang.annotation.ElementType @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER }) @Retention(RUNTIME) @Documented public @interface NotNull { String message() default "{javax.validation.constraints.NotNull.message}"; @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER }) @Retention(RUNTIME) @Documented @interface List { NotNull[] value(); } }
@NotNull.List(value = { @NotNull }) protected List<?> list;
e. 在JASE中提供了不多的內置註解,不過JBoss提供了一個 validation-api 的類庫,提供經常使用驗證註解。有興趣的朋友能夠下載看看,其 maven 依賴爲:
debug
<dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>1.0</version> </dependency>