参考实例
@Target({ ElementType.PARAMETER, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface SystemLog {
boolean value() default true;
}
一、@Retention
@Retention注解可以用来修饰其他注解,是注解的注解,称为元注解。@Retention注解有一个属性value,是RetentionPolicy类型的。Enum RetentionPolicy是一个枚举类型。
按生命周期将RetentionPolicy划分为3类:
- RetentionPolicy.SOURCE:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃
- RetentionPolicy.CLASS:注解被保留到class文件,但JVM加载class文件时候被遗弃,这是默认的生命周期
- RetentionPolicy.RUNTIME:注解不仅被保存到class文件中,JVM加载class文件之后,仍然存在
3个生命周期分别对应于:Java源文件(.java文件) —> .class文件 —> 内存中的字节码
二、@Documented
@Documented注解也可以用来修饰其他注解,是注解的注解,称为元注解。表明被修饰的内容应该被javadoc工具记录。默认情况下,javadoc是不包含注解的。但是如果声明注解时指定了@Documented,则它会被javadoc之类的工具处理,所以注解类型信息也会被包含在生成的文档中,是一个标记注解,没有成员。
三、@Target
@Target注解说明了Annotation所修饰的对象范围。Annotation可被用于packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造函数、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)。总体而言,@Target用于描述注解的使用范围(即:被描述的注解可以用在什么地方)
- CONSTRUCTOR:用于描述构造器
- FIELD:用于描述域
- LOCAL_VARIABLE:用于描述局部变量
- METHOD:用于描述方法
- PACKAGE:用于描述包
- PARAMETER:用于描述参数
- TYPE:用于描述类、接口(包括注解类型) 或enum声明
四、@Inherited
@Inherited注解也可以用来修饰其他注解,是注解的注解,称为元注解。@Inherited元注解指定被它修饰的注解将具有继承性,如果某个类使用了@XXX注解(定义该注解时使用了@Inherited注解),其子类自动被@XXX修饰。