首页 > 代码库 > Java之Annotation

Java之Annotation

一、概述

  Annotation(注解)是JDK5.0及以后版本引入的。它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。注解是以‘@注解名’在 代码中存在的,根据注解参数的个数,我们可以将注解分为:标记注解、单值注解、完整注解三类。它们都不会直接影响到程序的语义,只是作为注解(标识)存 在,我们可以通过反射机制编程实现对这些元数据(用来描述数据的数据)的访问。另外,你可以在编译时选择代码里的注解是否只存在于源代码级,或者它也能在class文件、或者运行时中出现(SOURCE/CLASS/RUNTIME)。

 

二、知识提要。

(一)Java.lang.annotation包

    这个包提供了Java对注解的支持策略。

 

1.Annotation接口

    Annotation是被所有注解类型扩展的接口。注意,扩展Annotation后的接口不需要定义注解类型,而且Annotation接口本身也没有定义注解类型。

 

2.ElementType枚举

    ElementType枚举中的常量可以在元素声明时对其进行分类。其常量被元注解Target使用,来指明被元注解Target描述的注解A可以被使用的领域。

    其常量取值如下,其含义是在该情况下注解A可以使用:

    ANNOTATION_TYPE      注解类型的声明

    CONSTRUCTOR     构造函数的声明

    FIELD        领域类型(包括枚举常量)的声明

    LOCAL_VARIABLE   局部变量的声明

    METHOD        方法的声明

    PACKAGE       包的声明

    PARAMETER      参数的声明

    TYPE            类、接口(包括注解)和枚举类型的声明

    示例:

import java.lang.annotation.ElementType;import java.lang.annotation.Target;@Target({ElementType.TYPE, ElementType.METHOD}) // 定义注解作用的目标:接口、类、枚举、注解,方法。public @interface Before {}

 

     这样就可以在接口、类、枚举、注解,方法的声明时使用@Before注解了。

 

3.RetentionPolicy枚举

    其取值被元注解Retention使用,说明了被Retention所描述的注解A的信息保存的策略。

    其取值和含义如下:

    SOURCE      注解A信息只保存在源文件中,被编译器丢弃

    CLASS        注解A信息被编译器吸纳,并保存到.class文件中,但是不会随.class文件被加载到VM中

    RUNTIME      注解A信息随.class问价被加载到VM中

import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;@Retention(RetentionPolicy.RUNTIME) // 注解信息被加载到VM public @interface Before {}

 

    这样,@Before的信息就会被加载到VM中去。

 

4.Documented注解

    表明一个元素内的注释默认会被javadoc等工具归档。当一个元素内的注释会影响该元素被用户使用时,应被Documented注解,使其注释成为公共API的一部分。

 

5.Inherited元注解

     表明被描述的注解A是自动继承的。若注解A在声明过程中被元注解Inherited描述,那么用户可以在一个类中查询注解A,如果该类没有注解A就从其父类中查询注解A,这样直到注解A被找到或者查询到Object类为止。

    示例:

import java.lang.annotation.Inherited;@Inherited // 允许子类继承父类的注解public @interface Before {}

 

 

6.Retention注解

    描述被注解A信息的保存策略,其取值为RetentionPolicy枚举型的常量值。示例参照RetentionPolicy。

 

7.Target注解

   表明被描述的注解类型A的作用目标,其取值为ElementType枚举类型的常量值。示例参照ElementType。

 

8.AnnotationTypeMismatchException异常

    若注解类型在编译或者序列化后发生了改变,则访问编译或序列化后的注解时抛出此异常。

 

9.IncompleteAnnotationException异常

    在注解类型被编译或者序列化后,若添加新的元素到该注解的类型定义,访问该新元素时抛出此异常。如果新元素有默认值则不抛出异常。

 

10.AnnotationFormatError

    当语法解析器从Class文件中读取注解并且认为该注解存在缺陷时,抛出此异常。

 

三、应用