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。