作用
为 Java 代码提供元数据,类似于生活中的标签;
注解的属性(元数据)
注解的属性也叫做成员变量,注解只有成员变量,没有方法。注解属性的定义方式为:以“无形参的方法”形式来声明,其方法名定义了该成员变量的名字,其返回值定义了该成员变量的类型,如下所示:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnnotation {
int id();
String msg();
}
注解元数据的获取
反射。从Class中获取注解元数据的代码示例如下:
@TestAnnotation()
public class Test {
public static void main(String[] args) {
boolean hasAnnotation = Test.class.isAnnotationPresent(TestAnnotation.class);
if ( hasAnnotation ) {
TestAnnotation testAnnotation = Test.class.getAnnotation(TestAnnotation.class);
System.out.println("id:"+testAnnotation.id());
System.out.println("msg:"+testAnnotation.msg());
}
}
}
Java 元注解
@Retention
当 @Retention 应用到一个注解上的时候,它解释说明了这个注解的的存活时间。它的取值如下:
- RetentionPolicy.SOURCE 注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视;
- RetentionPolicy.CLASS 注解只被保留到编译进行的时候,它并不会被加载到 JVM 中;
- RetentionPolicy.RUNTIME 注解可以保留到程序运行的时候,它会被加载进入到 JVM 中,所以在程序运行时可以获取到它们;
@Retention
将注解中的元素包含到 Javadoc 中去。
@Target
指定注解的应用场景,主要有以下几种:
- ElementType.ANNOTATION_TYPE 可以给一个注解进行注解;
- ElementType.CONSTRUCTOR 可以给构造方法进行注解;
- ElementType.FIELD 可以给属性进行注解;
- ElementType.LOCAL_VARIABLE 可以给局部变量进行注解;
- ElementType.METHOD 可以给方法进行注解;
- ElementType.PACKAGE 可以给一个包进行注解;
- ElementType.PARAMETER 可以给一个方法内的参数进行注解;
- ElementType.TYPE 可以给一个类型进行注解,比如类、接口、枚举;
@Inherited
允许子类继承父类的注解
参考: