Java標注Annotation)是Java語言5.0版本開始支持加入源代碼的特殊語法元數據

    Java語言中的類、方法、變量、參數和包等都可以被標注。Java標注和Javadoc不同,標注有自反性。在編譯器生成類文件時,標注可以被嵌入到字節碼中,由Java虛擬機執行時獲取到標注

    Java標注可以用于編譯時,也可以用于運行時。下面的討論主要集中于運行時。

    Annotation分類

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

    下面代碼展示了內建Annotation類型的用法:

 1 package com.bjinfotech.practice.annotation;
 2 
 3 /**
 4  * 演示如何使用java5內建的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         //動物類
20         class Animal{
21                 Food getFood(){
22                         return null;
23                 }
24                 //使用Annotation聲明Deprecated方法
25                 @Deprecated
26                 void deprecatedMethod(){
27                 }
28         }
29         //馬類-繼承動物類
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,開發者自定義Annotation:由開發者自定義Annotation類型。
    下面是一個使用annotation進行方法測試的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中,在運行時進行映射
11 @Retention(RetentionPolicy.RUNTIME)
12 //限定此annotation只能標示方法
13 @Target(ElementType.METHOD)
14 public @interface AnnotationDefineForTestFunction{}
15 
16 

    測試annotation的代碼如下:
 1 package com.bjinfotech.practice.annotation;
 2 
 3 import java.lang.reflect.*;
 4 
 5 /**
 6  * 一個實例程序應用前面定義的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                 //被檢測的類名
26                 String className="com.bjinfotech.practice.annotation.UsingAnnotation";
27                 //逐個檢查此類的方法,當其方法使用annotation聲明時調用此方法
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("測試 %s 失敗: %s %n", m, ex.getCause());
35                      failed++;
36                   }
37                }
38             }
39             System.out.printf("測試結果: 通過: %d, 失敗: %d%n", passed, failed);
40         }
41 }
42 
43 


    3,使用第三方開發的Annotation類型
    這也是開發人員所常常用到的一種方式。比如我們在使用Hibernate3.0時就可以利用Annotation生成數據表映射配置文件,而不必使用Xdoclet。