元注解:
@Target
@Retention
@Documented
@Inherited
(1)@Target 指定Annotation用于修饰那些程序元素 ,其包含一个名为“value"的成员变量,该成员变量的类型为ElementType[], ElementType为枚举类型,有以下值:
ElementType.TYPE: 能修饰类、接口或枚举类型
ElementType.FIELD: 能修饰成员变量
ElementType.METHOD:用于方法
ElementType.PARAMETER: 用于方法参数
ElementType.CONSTRUCTOR: 用于构造参数
ElementType.LOCAL_VARIABLE: 能修饰局部变量
ElementType.ANNOTATION_TYPE: 用于注解
ElementType.PACKAGE: 用于饰包
(2)Retention 说明这个注解的存活时间
RetentionPolicy.SOURCE 注解只保留到源码阶段,编译时被丢弃忽视
RetentionPolicy.CLASS 注解只保留到编译进行的时候,不会被加载到JVM中
RetentionPolicy.RUNTIME 注解保留到程序运行时,会被加载到JVM中,在程序运行时可获取到
(3)@Documented 能够将注解中的元素包含到javadoc中去
(4)@Inherited 如果一个超类被@Inherited注解过的注解进行注解的话,同时他的子类没有被任何注解应用的话,那么这个子类就继承了超类的注解
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@interface Test{}
@Test
public class A{}
public class B extends A{}
注解Test被@Inherited修饰,类A被Test注解,类B继承A,类B也拥有Test这个注解
@Repeatable可重复的, java1.8加进来的
@interface Persons{
Person[] value();
}
@Repeatable(Persons.class)
@interface Person{
String role default "";
}
@Person(role="artist")
@Person(role = "coder")
@Person(role = "teacher")
public class SuperMan{}
@Repeatable 注解了Person, @Repeatable后面括号中的类相当于一个容器注解
Element 的子类(AbstractProcessor中有用)
*ExecutableElement 表示某个类或接口的方法、构造方法或初始化程序(静态或实例),包括注释类型元素
对应@Target(Element.METHOD) @Target(ElementTye.CONSTRUCTOR)
*PackageElement 对应一个包程序元素,提供对有关包及其成员的信息访问
对应@Target(Element.PACKAGE)
*TypeElement 表示一个类或接口程序元素,提供对有关类型及其成员的信息访问
对应@Target(ElementType.TYPE)
*TypeParameterElement 表示一般类、接口、方法或构造方法的类型参数
对应@Target(ElementType.PARAMETER)
*VarialbeElement 表示一个字段、enum常量、方法或构造方法的参数、局部变量或异常参数
对应@Target(ElementType.LOCAL_VARIABLE)