0%

注解

注解(也被称为元数据)为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某个时刻非常方便地使用这些数据。

注解是众多引入到 Java SE5 中的重要语言变化之一。他们可以提供用来完整地描述程序所需的信息,而这些信息是无法用 Java 来表达的。因此,注解使得我们能够以将由编译器来测试和验证的格式,存储有关程序的额外信息。注解可以用来生成描述符文件,甚至或是新的类定义,并且有助于减轻编写“样板”代码的负担。通过使用注解,我们可以将这些元数据保存在 Java 源代码中,并利用 annotation API 为自己的注解构造处理工具,同时,注解的优点还包括:更加干净易读的代码以及编译期类型检查等。虽然 Java SE5 预先定义了一些元数据,但一般来说,主要还是需要程序员自己添加新的注解,并按照自己的方式使用他们。

内置注解

标准注解

Java SE5 内置了3种标准注解,定义在 java.lang 中:

  • @Override,表示当前的方法定义将覆盖超类中的方法。
  • @Deprecated,表示某一程序元素不建议使用了(过时了)。
  • @SuppressWarnings,用于关闭不当的编译器警告信息。

元注解

Java目前内置了四种元注解。元注解专职负责注解其他的注解:

  • @Target,表示该注解可以用于什么地方。可能的ElementType参数包括:
          CONSTRUCTOR:构造器的声明
          FIELD:域声明
          LOCAL_VARIABLE:局部变量声明
          METHOD:方法声明
          PACKAGE:包声明
          PARAMETER:参数声明
          TYPE:类、接口或enum声明
    
  • @Retention,表示需要在什么级别保存该注解信息。可选的RetentionPolicy参数包括:
          SUORCE:仅存在Java源文件,注解将被编译器丢弃。
          CLASS:注解在class文件中可用,但会被VM丢弃。
          RUNTIME:VM将在运行期也保留注解,因此可以通过反射机制读取注解的信息。
    
  • @Documented,将此注解包含在JavaDoc中。
  • @Inherited,允许子类继承父类中的注解——如果某个类使用了@Xxx注解(定义该Annotation时使用了@Inherited修饰)修饰,则其子类将自动被@Xxx修饰。

定义注解

下边是创建的自定义注解,看起来很像接口的定义,事实上,与其它任何 Java 接口一样,注解也将会被编译成 class 文件。

@Target(ElementType.Method)
@Retention(RetentionPolicy.RUNTIME)
public @interface Test{
    public int id();
    public String description() default "no description";
}

在注解中,一般都会包含一些元素以表示某些值。当分析处理注解时,程序或工具可以利用这些值。注解的元素看起来就像接口的方法,唯一的区别是你可以为其指定默认值。没有元素的注解称为标记注解(marker annotation)。