注解是一系列元数据,它利用元数据来解释、说明程序代码(即被注解的对象)。注解的作用包括:
1、提供信息给编译器,编译器可以利用注解来探测错误和警告信息。
2、软件工具可以利用注解信息来生成代码、HTML文档或者做其他相应处理。
3、运行时的处理,某些注解可以在程序运行时接受代码的提取。
注解通过关键字@interface进行定义,如:
public @interface TestAnnotation {}
元注解就是加到注解上的注解,它的目的是解释、说明其他普通注解。元注解有@Retention、@Documented、@Target、@Inherited、@Repeatable共5种。
元注解@Retention应用到一个注解时,说明该注解的存活时间。它的取值包括RetentionPolicy.SOURCE、RetentionPolicy.CLASS、RetentionPolicy.RUNTIME。RetentionPolicy.SOURCE表明注解只在源码阶段保留,在编译器进行编译时被丢弃;RetentionPolicy.CLASS表明注解被保留到编译进行的时候,而不会被加载到JVM中;RetentionPolicy.RUNTIME表明注解可以保留到程序运行的时候,它会被加载进入JVM中,在程序运行时可以获取到它们。
元注解@Documented表示注解内容会被Javadoc工具提取成文档,文档内容会因为注解内容的不同而不同。
元注解@Target表示注解用于什么地方,如类型、方法和域等。元注解@Target的取值包括ElementType.FIELD、ElementType.METHOD、ElementType.PARAMETER、ElementType.CONSTRUCTOR、ElementType.LOCAL_VARIABLE、ElementType.TYPE、ElementType.ANNOTATION_TYPE、ElementType.PACKAGE。其中,ElementType.FIELD表示对字段、枚举常量的注解,ElementType.METHOD表示对方法的注解,ElementType.PARAMETER表示对方法参数的注解,ElementType.CONSTRUCTOR表示对构造函数的注解,ElementType.LOCAL_VARIABLE表示对局部变量的注解,ElementType.ANNOTATION_TYPE表示对注解类型的注解,ElementType.PACKAGE表示对包的注解,ElementType.TYPE表示对接口、类、枚举、注解等任意类型的注解。
被元注解@Inherited注解过的注解作用于父类后,子类会自动继承父类的注解。
元注解@Repeatable是在Java1.8中引入的注解,被注解后的普通注解可以被重复多次作用于一个类并传入不同的参数,代码示例如下:
@interface Persons {
Person[]value();
}
@Repeatable(Persons.class)
@interface Person {
String role default "";
}
@Person(role="artist")
@Person(role="coder")
@Person(role="PM")
public class SuperMan {
}