元注解的作用是负责解释注解的其他注解,Java中定义了4个标准的元注解(mate-annotation)类型,它们被用来提供对其他的注解(annotation)的类型做以说明.
这些类型和它们所支持的类都能在java.lang.annotation包中可以找到,它们分别是(@Target,@Retention,@documented,@Inherited).
1.@Target:用于描述注解的使用范围,就是被描述的注解可以用在什么地方.
2.@Retention:表示需要在什么级别保存该注释信息,用于描述注解的生命周期.(SOURCE(源代码) 3.@documented:说明该注解将被包含在javadoc中,就是是否生成文档注释. 4.@Inherited(继承):说明子类可以继承父类的该注解. 好了,说了那么多,让我们来自定义一个元注解吧. 最后,我们再说一下@Target,@Retention中的value的参数,首先让我们看看源码: 这里我们就可以看到,在@Target中我们要传入的value是一个ElementType数组. 在这里我们可以知道ElementType数组中定义了有10个元素,它们的意思我们也可根据它们的名字很容易理解,所以我们到时候需要什么值就传入对应的元素就行了. 2.我们在来看看@Retention源码: 这里我们就可以看到,在@Retention中我们要传入的value是一个RetentionPolicy数组. RetentionPolicy数组中定义了只有3个元素,它们分别是SOURCE,CLASS,RUNTIME,在这里我需要说明一下它们的关系SOURCEpackage com.ffyc.kuang.annotation;
import java.lang.annotation.*;
//自定义一个元注解
public class Annotationtext2 {
//这里看到我们定义的注解是没有问题的,程序没有报错.
@MyAnnotation
public void test() {
}
}
//首先让我们定义一个注解:
//@Target表示我们的注解可以用在那些地方.
//value里面的值都已经定义好了,我们只需要选择想要的就可以,这里我们选择的是METHOD(方法),表示该注解只能在方法中运行,当我们在其他地方使用该注解,程序会报错
//这里的ElementType是一个数组,当我们需要传多个值时,我们就可以用value = [ElementType.METHOD,ElementType.(参数值1),,ElementType.(参数值2)];
@Target(value = ElementType.METHOD)
//Retention 表示我们的注解在什么地方还有效
//这里的RetentionPolicy是一个数组,它里面只有3个值:SOURCE,CLASS,RUNTIME.其中SOURCE
1.我们先来看看@Target源码:@documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
ElementType[] value();
}
让我们在看看ElementType[ ]的源码:public enum ElementType {
TYPE,
FIELD,
METHOD,
PARAMETER,
CONSTRUCTOR,
LOCAL_VARIABLE,
ANNOTATION_TYPE,
PACKAGE,
TYPE_PARAMETER,
TYPE_USE
}
@documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
RetentionPolicy value();
}
让我们在看看RetentionPolicy[ ]的源码:public enum RetentionPolicy {
SOURCE,
CLASS,
RUNTIME
}
当我们知道这一点是,我们到时候需要什么值就传入对应的元素就行了.



