Java自定義Annotation方法

1. 基本語法 

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 
*///~

2. 元註解 

     在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:  容許子類繼承父類中的註解。

3. 使用技巧 

   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>
相關文章
相關標籤/搜索