什么是元注解?
元注解就是用来解释其他的注解,对自定义注解进行注解。
6个元注解
java8定义了6个标准元注解:@Target,@Retention,@Documented,@Inherited,@Repeatable和@Native。
@Target
描述注解的使用范围(即被修饰的注解可以用在什么地方,类定义上,方法,参数等),@Target注解用来说明那些被他注解的注解类可修饰的对象范围。
定义只能写在方法或者参数上的注解:
@Target({ ElementType.METHOD, ElementType.PARAMETER })// 只能写在方法或者参数上
public @interface Anno {
}
@Retention
描述注解保留的时间范围(即被描述的注解在它所修饰的类中可以被保留到何时),@Retention注解用来限定那些被他所注解的注解类在注解到其他类上以后,可以保留多长时间,@Rentention 包含一个 RetentionPolicy 类型的成员变量, 使用 @Rentention 时必须为该 value 成员变量指定值(值有三种)。
Retention.SOURCE | 注解只在源文件中保留,在编译期间删除 |
Retention.CLASS | 默认是该值,注解只在编译期间存在于.class文件中,运行时JVM不可获取注解信息 |
Retention.RUNTIME | 运行时JVM可以获取注解信息(反射),是最长注解持续期 |
@Retention(RetentionPolicy.SOURCE) //只在源码中
@Retention(RetentionPolicy.RUNTIME) //使用该注解保留到运行前
public @interface Anno {
}
@Documented
描述在使用javadoc工具为类生成帮助文档时是否要保留其注解信息,定义注解类时使用@Documented注解进行修饰,则所有使用该注解修饰的程序元素的API文档中将会包含该注解说明。
@Documented
public @interface Anno{
public String doc();
}
@Inherited
使被他修饰的注解具有继承性(如果某个类使用了被@Inherited修饰的注解,则其子类将自动具有该注解。),用于指示子类是否可以继承父类中的注解。
@Retention(RetentionPolicy.RUNTIME)
public @interface Anno {
}
@Repeatable
用于声明标记的注解为可重复类型注解,可以在同一个地方多次使用。
public @interface Roles {
Role[] value();
}
@Repeatable(Roles.class)
public @interface Role {
String roleName();
}
@Repeatable中的参数为被修饰注解的容器的类对象(class对象)
@Native
@Native注解修饰成员变量,则表示这个变量可以被本地代码引用,常常被代码生成工具使用。但是此注解不常使用,了解即可。