注解的概述以及基本注解类型
注解(Annotation):在JDK1.5之后增加的一个新特性
现实中,Hibernate、Spring等框架中都大量使用注解。注解作为程序的元数据嵌入到程序。注解可以被解析工具或编译工具解析,此处注意注解不同于注释(comment)。当一个接口直接继承java.lang.annotation.Annotation接口时,仍是接口,而并非注解。要想自定义注解类型,只能通过@interface关键字的方式,其实通过该方式会隐含地继承.Annotation接口。
基本的注解类型
Documented:表示含有该注解类型的元素(带有注释的)会通过javadoc或者类似的工具进行文档话。该类型应用于注解那些影响客户使用带注释的元素声明的类型。如果类型声明是用的Documented来注解,这种类型的注解被作为被标注的程序成员的公共API
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Documented {
}
Inherited:表示该注解类型被自动继承,如果用户在当前类中查询这个元注解类型并且当前类的声明中不包含这个元注解类型,那么也将自动查询当前类的父类是否存在Inherited元注解,这个动作将被重复执行知道这个标注类型被找到,或者是查询到顶层的父类。
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Inherited {
}
Retention:表示该注解类型的注解保留的时长。当注解类型声明中没有@Retention元注解,则默认保留策略为RetentionPolicy.CLASS。关于保留策略(RetentionPolicy)是枚举类型,共定义3种保留策略
Source:仅保存在java源文件,经过编译器后便丢弃相应的注解
Class:存在java源文件,以及经编译器后生成的Class字节吗文件,但在运行时VM不再保留注释
Runtime:存在源文件、编译生成的Class字节码文件,以及保留在运行时VM中,可通过反射性地读取注解
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
RetentionPolicy value();
}
上面源码@Retention的定义中有一行@Retention(RetentionPolicy.RUNTIME),意思是指当前注解的保留策略为RUNTIME,即存在Java源文件,也存在经过编译器编译后的生成的Class字节码文件,同时在运行时虚拟机(VM)中也保留该注解,可通过反射机制获取当前注解内容。
Target:表示该注解类型的所使用的程序元素类型。当注解类型声明中没有@Target元注解,则默认为可适用所有的程序元素。如果存在指定的@Target元注解,则编译器强制实施相应的使用限制。关于程序元素(ElementType)是枚举类型,共定义8种程序元素:ANNOTATION_TYPE——注解类型声明,CONSTRUCTOR——构造方法声明,LOCAL_VARIABLE—— 局部变量声明,METHOD——方法声明,PACKAGE——包声明,PARAMETER——参数声明,TYPE——类、接口(包括注解类型)或枚举声明
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
ElementType[] value();
}