首页 > 代码库 > 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文件中读取注解并且认为该注解存在缺陷时,抛出此异常。
三、应用