一、什么是注解
Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。
Java 语言中的类、方法、变量、参数和包等都可以被标注。和 Javadoc 不同,Java 标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节码中。Java 虚拟机可以保留标注内容,在运行时可以获取到标注内容 。 当然它也支持自定义 Java 标注。
二、元注解
JDK5.0提供了4个元注解:@Target、@Retention、@Documented、@Inherited,JDK8.0后增加了2个注解:@Repeatable、@Native。
1、@Target
表示注解可以用在的地方,该注解需要ElementType类型的参数:
@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,
/**
*JDK8.0增加,类型参数声明
*/
TYPE_PARAMETER,
/**
*JDK8.0增加,类型的使用
*/
TYPE_USE
}
2、@Retention
表示注解的声明周期,该注解需RetentionPolicy类型参数:
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
/**
* 返回保留策略
*/
RetentionPolicy value();
}
RetentionPolicy为枚举类型:
public enum RetentionPolicy {
/**
* Java源文件阶段
*/
SOURCE,
/**
*Java文件编译为class文件阶段
*/
CLASS,
/**
*运行阶段
*/
RUNTIME
}
3、@Documented
类和方法的 Annotation 在缺省情况下是不出现在 javadoc 中的。如果使用 @Documented 修饰该 Annotation,则表示它可以出现在 javadoc 中。
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Documented {
}
4、@Inherited
@Inherited注解,是指定某个自定义注解如果写在了父类的声明部分,那么子类的声明部分也能自动拥有该注解。@Inherited注解只对那些@Target被定义为ElementType.TYPE的自定义注解起作用。
5、@Repeatable
@Repeatable注解表明标记的注解可以多次应用于相同的声明或类型。
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Inherited {
}
6、@Native
指示可以从本机代码引用定义常数值的字段。生成本机头文件的工具可以使用该注释作为提示,以确定是否需要头文件,如果需要,应该包含哪些声明(只对字段有效)。
@Documented
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.SOURCE)
public @interface Native {
}
三、自定义注解
1、定义注解
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnotationTest {
String value() default "";
}
2、注解绑定
public class EntityTest {
@AnnotationTest("测试")
private String test;
public String getTest() {
return test;
}
public void setTest(String test) {
this.test = test;
}
}
3、反射获取注解
public class TestAnnotation {
public static void main(String[] args) throws Exception{
Class cls = Class.forName("com.example.entity.EntityTest");
Field[] fields = cls.getDeclaredFields();
for(Field field : fields){
if(field.isAnnotationPresent(AnnotationTest.class)){
AnnotationTest annotationTest = field.getAnnotation(AnnotationTest.class);
System.out.println(annotationTest.value());
}
}
}
}
四、运行结果