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。