自定义注解符合注解的所有使用特征,根据你配置的注解范围(target),即可以在类上使用,也可以在方法上使用。自定义注解在jdk1.5开始才有的新特性。注解作为程序的元数据嵌入到程序当中。注解可以被一些解析工具或者是编译工具进行解析。
先由自定义注解示例来引入本节吧~
package com.zhanglf.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Documented
@Target({ElementType.METHOD,ElementType.TYPE})
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface ValidSecure {
String author() default "xiaoming";
int revision() default 1;
boolean isCheck() default true;
}
首先知道啥是元注解:元注解的作用就是负责注解其他注解。
jdk1.5以后提供了四种元注解,这些类型和它们所支持的类在java.lang.annotation包中可以找到,四种类型的元注解,各自的解释和使用说明如下:
1.@Documented ——用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化。Documented是一个标记注解,没有成员。如果一种声明使用Documented进行注解,这种类型的注解被作为被标注的程序成员的公共API。(这个注解在接口安全设计上是可用可不用的。)
2.@Target——指明了Annotation所修饰的对象范围:Annotation可被用于 packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)。在Annotation类型的声明中使用了target可更加明晰其修饰的目标。该元注解的取值可以为TYPE,METHOD,CONSTRUCTOR,FIELD等。如果Target元注解没有出现,那么定义的注解可以应用于程序的任何元素。(这个注解不只是在接口安全设计上要用,任何自定义注解都是必不可少的)
取值(ElementType)使用解释:
1.CONSTRUCTOR:用于描述构造器
2.FIELD:用于描述域
3.LOCAL_VARIABLE:用于描述局部变量
4.METHOD:用于描述方法
5.PACKAGE:用于描述包
6.PARAMETER:用于描述参数
7.TYPE:用于描述类、接口(包括注解类型) 或enum声明
3.@Inherited——指明该注解类型被自动继承。如果用户在当前类中查询这个元注解类型并且当前类的声明中不包含这个元注解类型,那么也将自动查询当前类的父类是否存在Inherited元注解,这个动作将被重复执行知道这个标注类型被找到,或者是查询到顶层的父类。(该注解在接口安全设计上可用可不用。)
4.@Retention——指明了该Annotation被保留的时间长短:某些Annotation仅出现在源代码中,而被编译器丢弃;而另一些却被编译在class文件中;编译在class文件中的Annotation可能会被虚拟机忽略,而另一些在class被装载时将被读取(请注意并不影响class的执行,因为Annotation与class在使用上是被分离的)。使用这个meta-Annotation可以对 Annotation的“生命周期”限制。RetentionPolicy取值为SOURCE,CLASS,RUNTIME。(同2,也是自定义接口必不可少的元注解)
取值(RetentionPoicy)解释:
1.SOURCE:在源文件中有效(即源文件保留)
2.CLASS:在class文件中有效(即class保留)
3.RUNTIME:在运行时有效(即运行时保留)
使用自定义注解有以下几点需要注意:
1.注解方法不能带有参数;
2.注解方法返回值类型限定为:基本类型、String、Enums、Annotation或者是这些类型的数组;
3.注解方法可以有默认值;
4.注解本身能够包含元注解,元注解被用来注解其它注解。