Java標(biāo)注Annotation)是Java語(yǔ)言5.0版本開始支持加入源代碼的特殊語(yǔ)法元數(shù)據(jù)

    Java語(yǔ)言中的類、方法、變量、參數(shù)和包等都可以被標(biāo)注。Java標(biāo)注和Javadoc不同,標(biāo)注有自反性。在編譯器生成類文件時(shí),標(biāo)注可以被嵌入到字節(jié)碼中,由Java虛擬機(jī)執(zhí)行時(shí)獲取到標(biāo)注

    Java標(biāo)注可以用于編譯時(shí),也可以用于運(yùn)行時(shí)。下面的討論主要集中于運(yùn)行時(shí)。

    Annotation分類

    1,內(nèi)建Annotation——Java5.0版在java語(yǔ)法中經(jīng)常用到的內(nèi)建Annotation:
    @Deprecated用于修飾已經(jīng)過(guò)時(shí)的方法;
    @Override用于修飾此方法覆蓋了父類的方法(而非重載);
    @SuppressWarnings用于通知java編譯器禁止特定的編譯警告。

    下面代碼展示了內(nèi)建Annotation類型的用法:

 1 package com.bjinfotech.practice.annotation;
 2 
 3 /**
 4  * 演示如何使用java5內(nèi)建的annotation
 5  * 參考資料:
 6  * http://java.sun.com/docs/books/tutorial/java/javaOO/annotations.html
 7  * http://java.sun.com/j2se/1.5.0/docs/guide/language/annotations.html
 8  * http://mindprod.com/jgloss/annotations.html
 9  * @author cleverpig
10  *
11  */
12 import java.util.List;
13 
14 public class UsingBuiltInAnnotation {
15         //食物類
16         class Food{}
17         //干草類
18         class Hay extends Food{}
19         //動(dòng)物類
20         class Animal{
21                 Food getFood(){
22                         return null;
23                 }
24                 //使用Annotation聲明Deprecated方法
25                 @Deprecated
26                 void deprecatedMethod(){
27                 }
28         }
29         //馬類-繼承動(dòng)物類
30         class Horse extends Animal{
31                 //使用Annotation聲明覆蓋方法
32                 @Override
33                 Hay getFood(){
34                         return new Hay();
35                 }
36                 //使用Annotation聲明禁止警告
37                 @SuppressWarnings({"deprecation","unchecked"})
38                 void callDeprecatedMethod(List horseGroup){
39                         Animal an=new Animal();
40                         an.deprecatedMethod();
41                         horseGroup.add(an);
42                 }
43         }
44 }
45 
46 

    2,開發(fā)者自定義Annotation:由開發(fā)者自定義Annotation類型。
    下面是一個(gè)使用annotation進(jìn)行方法測(cè)試的sample:

    AnnotationDefineForTestFunction類型定義如下:

 1 
 2 package com.bjinfotech.practice.annotation;
 3 
 4 import java.lang.annotation.*;
 5 /**
 6  * 定義annotation
 7  * @author cleverpig
 8  *
 9  */
10 //加載在VM中,在運(yùn)行時(shí)進(jìn)行映射
11 @Retention(RetentionPolicy.RUNTIME)
12 //限定此annotation只能標(biāo)示方法
13 @Target(ElementType.METHOD)
14 public @interface AnnotationDefineForTestFunction{}
15 
16 

    測(cè)試annotation的代碼如下:
 1 package com.bjinfotech.practice.annotation;
 2 
 3 import java.lang.reflect.*;
 4 
 5 /**
 6  * 一個(gè)實(shí)例程序應(yīng)用前面定義的Annotation:AnnotationDefineForTestFunction
 7  * @author cleverpig
 8  *
 9  */
10 public class UsingAnnotation {
11         @AnnotationDefineForTestFunction public static void method01(){}
12         
13         public static void method02(){}
14         
15         @AnnotationDefineForTestFunction public static void method03(){
16                 throw new RuntimeException("method03");
17         }
18         
19         public static void method04(){
20                 throw new RuntimeException("method04");
21         }
22         
23         public static void main(String[] argv) throws Exception{
24                 int passed = 0, failed = 0;
25                 //被檢測(cè)的類名
26                 String className="com.bjinfotech.practice.annotation.UsingAnnotation";
27                 //逐個(gè)檢查此類的方法,當(dāng)其方法使用annotation聲明時(shí)調(diào)用此方法
28             for (Method m : Class.forName(className).getMethods()) {
29                if (m.isAnnotationPresent(AnnotationDefineForTestFunction.class)) {
30                   try {
31                      m.invoke(null);
32                      passed++;
33                   } catch (Throwable ex) {
34                      System.out.printf("測(cè)試 %s 失敗: %s %n", m, ex.getCause());
35                      failed++;
36                   }
37                }
38             }
39             System.out.printf("測(cè)試結(jié)果: 通過(guò): %d, 失敗: %d%n", passed, failed);
40         }
41 }
42 
43 


    3,使用第三方開發(fā)的Annotation類型
    這也是開發(fā)人員所常常用到的一種方式。比如我們?cè)谑褂肏ibernate3.0時(shí)就可以利用Annotation生成數(shù)據(jù)表映射配置文件,而不必使用Xdoclet。