注解是一种特殊的标记,可以用在方法、类、参数和包上,程序在编译或运行时可以检测到这些标记而进行一些特殊的处理。
注解的元素类型
元注解主要有@Target,@Retention,@Documented,@Inherited,是用来解释注解的注解。
@Target表示可以应用的java元素类型
Target类型 | 描述 |
---|---|
ElementType.TYPE | 应用于类、接口(包括注解类型)、枚举 |
ElementType.FIELD | 应用于属性(包括枚举中的常量) |
ElementType.METHOD | 应用于方法 |
ElementType.PARAMETER | 应用于方法的形参 |
ElementType.CONSTRUCTOR | 应用于构造函数 |
ElementType.LOCAL_VARIABLE | 应用于局部变量 |
ElementType.ANNOTATION_TYPE | 应用于注解类型 |
ElementType.PACKAGE | 应用于包 |
ElementType.TYPE_PARAMETER | 1.8版本新增,应用于类型变量) |
ElementType.TYPE_USE | 1.8版本新增,应用于任何使用类型的语句中(例如声明语句、泛型和强制转换语句中的类型) |
生命周期类型 | 描述 |
---|---|
RetentionPolicy.SOURCE | 编译时被丢弃,不包含在类文件中 |
RetentionPolicy.CLASS | JVM加载时被丢弃,包含在类文件中,默认值 |
RetentionPolicy.RUNTIME | 由JVM 加载,包含在类文件中,在运行时可以被获取到 |
@Documented表明该注解标记的元素可以被Javadoc或类似的工具文档化
@Inherited表名该注解标记的类的子类也拥有这个注解
实例
(1)定义注解@MetaAnnotation
package com.reflection;
public @interface MetaAnnotation {
String value();
}
(2)定义注解@MyAnnotation
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface MyAnnotation {
String color() default "blue";
//特殊的类型,如果只需要给value赋值,value变量可以省略
String value();
int[] arrayAttr() default {3, 4};
//在注解中使用注解
MetaAnnotation annotation() default @MetaAnnotation("abcd");
}
(3)注解测试类
package com.reflection;
@MyAnnotation(color="red", value="kkk", arrayAttr={1,2,3},
annotation=@MetaAnnotation("llllll"))
public class AnnotationTest {
@MyAnnotation("xyz")
public static void main(String[] args) {
System.runFinalizersOnExit(true);
//判断类有没有指定注解
if (AnnotationTest.class.isAnnotationPresent(MyAnnotation.class)) {
MyAnnotation annotaion = AnnotationTest.class.getAnnotaion(MyAnnotation.class);
System.out.println(annotaion);
//输出注解中的参数
System.out.println(annotation.color());
System.out.println(annotation.value());
System.out.println(annotation.arrayAttr().length);
System.out.println(annotation.annotation().value());
}
}
}
输出结果:
@com.reflection.MyAnnotation(color=red, annotation=@com.reflection.MetaAnnotation(value=fllll), arrayAttr=[1, 2, 3], value=kkk)
red
kkk
3
llllll