Java Annotation

Annotation,译为「注解」或「注释」,是从 JDK 1.5 开始引入的特性,也有好些年的历史了。

What's Annotation? Annotation 提供这么一种机制:它将一些描述性内容与 Java 程序的元素(类型,方法,成员变量等)进行关联,这些描述性内容不影响 Java 程序的执行,但可以通过反射的方式访问到。

Annotation 在目前已得到广泛应用,以常用的 Struts+Spring+Hibernate 模式的 Web 开发为例,这三部分都大量使用 Annotation, 另,Servlet 从3.0开始也开始支持 Annotation, 甚至 Java Web App 中可以不再需要 web.xml, 相关的设置都通过 Annotation 定义。

Java 里有三个内置的 annotation,分别是:

  • @Override 标识重写的方法
  • @Depricated 标识过时的类,方法,变量等
  • @SuppressWarnings("unchecked") 不显示警告信息

用户还可以自定义「注解」,自定义时,需要用到 @Retention 和 @Target 等「元注解」。注解的注解称为「元注解」。举例说明如下:

1. 定义空「注解」,仅用于演示。

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface HelloAnnotation {
    // 定义一个空的「注解」,仅用于演示。
}

2. 使用「注解」的类。

public class HelloUseAnnotation {
        @HelloAnnotation
        public String hello() {
               return "Hello" ;
       }
      
        public String hello2() {
               return "Hello2";
       }
}

3. 通过工具访问注解示例。

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
public class Client {
    public static void main(String[] args) {
        for (Method m : HelloUseAnnotation.class.getDeclaredMethods()) {
            Annotation[] ans = m.getAnnotations();
            System.out.println(m.getName() + "() has annotations? ");
           
            // 在生产项目中,得到不同的注释,就可以做有业务意义的操作了。
            if (ans.length > 0) {
                System.out.println(" YES!");
            } else {
                System.out.println(" NO!");
            }
        }
    }
}

自定义 Annotation 类型的成员的类型限制:only primitive type, String, Class, annotation, enumeration are permitted or 1-dimensional arrays thereof...

这样是不行的:Date createdDate() default new Date();

注解可用的位置有: package, class, method and etc...(自定的时,元注解可以限定 TYPE)

有关 Annotation,Java SDK 在 java.lang.annotation.* 提供大量现成工具。

想当年,这个特性还不叫着 new feature, 现在,这个早已是 old function 了。按良葛格的说法,Annotation 是 metadata 在 Java 中的实现。有关 Annotation 的一些规范内容,可以参考 JLS 中相关说明。

自定义 Annotation 主要用于基础工具的编写,在一般的应用开发中使用并不多。

参考: