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。