- 生成文档。这是最常见的,也是java 最早提供的注解。常用的有@see @param @return 等
- 跟踪代码依赖性,实现替代配置文件功能。比较常见的是spring 2.5 开始的基于注解配置。作用就是减少配置。现在的框架基本都使用了这种配置来减少配置文件的数量。也是
- 在编译时进行格式检查。如@override 放在方法前,如果你这个方法并不是覆盖了超类方法,则编译时就能检查出。
包 java.lang.annotation 中包含所有定义自定义注解所需用到的原注解和接口。如接口 java.lang.annotation.Annotation 是所有注解继承的接口,并且是自动继承,不需要定义时指定,类似于所有类都自动继承Object。
该包同时定义了四个元注解,Documented,Inherited,Target(作用范围,方法,属性,构造方法等),Retention(生命范围,源代码,运行时)。
Inherited
表示一个Annotation能否被使用其类的子类继续继承下去,如果没有写此注释,则此Annotation根本就是无法继承的。
Documented
@Documented 将此注解包含在 javadoc 中 ,它代表着此注解会被javadoc工具提取成文档。在doc文档中的内容会因为此注解的信息内容不同而不同。
Target
因为可以在任意的位置上使用自定义的Annotation,则在操作的时候就会出现一些问题,例如:一些Annotation只希望在方法的声明上使用,那么此时,就必须设置Annotation的作用范围。
在@Target注释中,存在ElementType类型的变量。
在此变量中存在七种范围:
- 只能在Annotation中出现(注释类声明):public static final ElementType ANNOTATION_TYPE
- 只能在构造方法中出现(构造方法声明):public static final ElementType CONSTRUCTOR
- 局部变量():public static final ElementType LOCAL_VARIABLE
- 只能在方法上使用(方法声明):public static final ElementType METHOD
- 在参数声明上使用:public static final ElementType PARAMETER
- 在包声明上使用:public static final ElementType PACKAGE
- 类、接口(包括注释类型)或枚举声明:public static final ElementType TYPE
在java.lang.annotation包中定义了所有的与Annotation有关的操作,先观察Retention。
Retention本身是一个Annotation,其中的取值是通过RetentionPolicy这个枚举类型指定的范围。
在RetentionPolicy中规定了以下的三个取值范围:
- 只在编译之后的class中起作用:public static final RetentionPolicy CLASS
- 只在运行的时候起作用:public static final RetentionPolicy RUNTIME
- 只在源代码中起作用:public static final RetentionPolicy SOURCE
如果一个Annotation要想起作用,则必须使用RUNTIME范围。
反射与Annotation
一个Annotation如果要想起作用,则肯定要依靠反射机制。通过反射可以取得在一个方法上声明的Annotation的全部内容。
在Field、Method、Constructor的父类java.lang.reflect.AccessibleObject上定义了以下与Annotation反射操作相关的方法:
- 取得全部的Annotation:Annotation[] getAnnotations()
- 取得特定的Annotation:public <T extends Annotation> T getAnnotation(Class<T> annotationClass)
- 判断操作的是否是指定的Annotation:public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)
注意:要想自定义有Annotation生效,必须使用“@Retention(value = RetentionPolicy.RUNTIME)”。