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。