元注解的作用,什么是元注解
元注解对注解进行注解,可以通过下面案例进行理解
自己定义一个注解
注解和类与接口相似,也是定义出来的,我们可以自定义一个注解
public @interface MyAnnotation{
}
这就是一个简单的自定义注解了,我们可以使用他
public class Test02 {
@MyAnnotation//使用注解
public void test(){
}
}
元注解@Target
target是目标的意思,@Target表示我们的注解可以用在哪些地方
话不多说上代码
@Target(value = ElementType.METHOD)
@interface MyAnnotation{
}
@Target这个注解需要参数,参数内容就是能作用的目标
参考上述代码,参数为ElementType.METHOD,那么这个注解就只能用来注解方法,注解类或者是其他东西就会报错:
如果要想要该注解能够注解其他东西,那么就需要给@Target添加其他的参数
@Target(value = {ElementType.METHOD,ElementType.TYPE})
@interface MyAnnotation{
}
这样就可以注解类了
@Target参数 | 参数内容 |
---|---|
@Target(ElementType.TYPE) | 接口、类、枚举、注解 |
@Target(ElementType.FIELD) | 字段、枚举的常量 |
@Target(ElementType.METHOD) | 方法 |
@Target(ElementType.PARAMETER) | 方法参数 |
@Target(ElementType.CONSTRUCTOR) | 构造函数 |
@Target(ElementType.LOCAL_VARIABLE) | 局部变量 |
@Target(ElementType.ANNOTATION_TYPE) | 注解 |
@Target(ElementType.PACKAGE) | 包 |
元注解@Retention
Retention表示我们的注解在什么地方还有效
@Retention(value = RetentionPolicy.RUNTIME)
@interface MyAnnotation{
}
元注解@Retention的参数 | 作用 |
---|---|
RetentionPolicy.SOURCE | 这种类型的Annotations只在源代码级别保留,编译时就会被忽略,在class字节码文件中不包含。 |
RetentionPolicy.CLASS | 这种类型的Annotations编译时被保留,默认的保留策略,在class文件中存在,但JVM将会忽略,运行时无法获得。 |
RetentionPolicy.RUNTIME | 这种类型的Annotations将被JVM保留,所以他们能在运行时被JVM或其他使用反射机制的代码所读取和使用 |
一般来说我们就用RetentionPolicy.RUNTIME就可以了,
runtime>class>sources
runtime包含了class和sources,class包含了sources
元注解@Document
@Documented表示是否将我们的注解生成在JAVAdoc中
元注解@Inherited
@Inherited表示子类可以继承父类的注解