什么是元注解?元注解就是修饰其他注解的注解
例如:
JDK5.0提供了四种元注解:Retention、Target、Documented、Inherited
【1】Retention
可以Retention注解的作用是:描述注解保留的时间范围(即:被描述的注解在它所修饰的类中可以保留到何时)
Retention注解用来限定那些被它所注解的注解类在注解到其他类上以后,可被保留到何时,共三种策略,定义在RetentionPolicy枚举中,使用@Retention时必须为该value成员变量指定值:
public enum RetentionPolicy{
SOURCE, //源文件保留
CLASS, //编译期保留,默认值
RUNTIME, //运行期保留,可通过反射去获取注解信息
}
RetentionPolicy.SOURCE:在源文件中有效(即源文件保留),编译器直接丢弃这种策略的注释,在.class文件中不会保留注解信息
案例:
?
?反编译查看字节码文件:发现字节码文件中没有MyAnnotation这个注解
RetentionPolicy.CLASS:在.class文件中有效(即class保留),保留在.class文件中,但是当运行java程序时,他就不会继续加载了,不会保留在内存中,JVM不会保留注解,如果注释没有加Retention元注解,那么相当于默认的注解就是这种状态
Retention.RUNTIME:在运行时有效(即运行时保留),当运行java程序时,JVM会保留注释,加载在内存中,那么程序可以通过反射获取该注释
?【2】Target
Target用于修饰注解的注解,用于指定被修饰的注解能用于修饰哪些程序元素(类、属性、方法、构造器...),@Target也包含一个名为value的成员变量
案例:
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.ElementType.FIELD;
@Target({TYPE,FIELD})//TYPE和FIELD只在修饰类和属性时有效
public @interface MyAnnotation {
}
?【3】Documented
????????Documented注解的作用是:描述在使用 javadoc 工具为类生成帮助文档时是否要保留其注解信息。
- 创建一个带有@Documented修饰的自定义注解类MyDocumentedAnnotation
- 再创建一个MyDocumentedTest类
- 使用一下命令为MyDocumentedTest类生成帮助文档(API)
- 查看API可发现:只要是被MyDocumentedAnnotation注解修饰的不管是类方法还是属性等,上面都保留了MyDocumentedAnnotation的注解信息
【4】Inherited
????????Inherited注解的作用是:使被它修饰的注解具有继承性(如果某个类使用了被@Inherited修饰的注解,则其子类将自动具有该注解)。
import java.lang.annotation.Inherited;
@Inherited//修饰自定义注解MyAnnotation
public @interface MyAnnotation {
}
@MyAnnotation//修饰父类
public class Person {
}
//由于父类Person被@Inherited修饰的自定义@MyAnnotation修饰了,因此子类也继承了@MyAnnotation
public class Student extends Person{
}
|