自定义注解
Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。Java 语言中的类、方法、变量、参数和包等都可以被标注。和 Javadoc 不同,Java 标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节码中。Java 虚拟机可以保留标注内容,在运行时可以获取到标注内容 。 当然它也支持自定义 Java 标注。
元注解
JDK中自带了专门修饰注解的修饰,它是为了能更好地设计自定义注解的细节而专门设计的
一、@Target
指定注解能修饰的对象,@Target注解参数:
public enum ElementType {
/** 类, 接口 (包括注解类型), 或者枚举的声明
* Class, interface (including annotation type), or enum declaration
*/
TYPE,
/** 属性的声明 (包括枚举常量)
* Field declaration (includes enum constants)
*/
FIELD,
/** 方法的声明
* Method declaration
*/
METHOD,
/** 参数形式的声明
* Formal parameter declaration
*/
PARAMETER,
/** 构造方法的声明
* Constructor declaration
*/
CONSTRUCTOR,
/** 局部变量的声明
* Local variable declaration
*/
LOCAL_VARIABLE,
/** 注解类型的声明
* Annotation type declaration
*/
ANNOTATION_TYPE,
/** 包的声明
* Package declaration
*/
PACKAGE,
/**
* 类型参数的声明
* Type parameter declaration
* @since 1.8
*/
TYPE_PARAMETER,
/**
* 表示该注解能写在使用类型的任何语句中(eg:声明语句、泛型和强制转换语句中的类型)
* Use of a type
* @since 1.8
*/
TYPE_USE
}
二、@Retention
指定注解的生命周期,@Retention注解参数:
public enum RetentionPolicy {
/**
* Java源文件阶段
* Annotations are to be discarded by the compiler.
*/
SOURCE,
/**
* Class文件阶段
* Annotations are to be recorded in the class file by the compiler
* but need not be retained by the VM at run time. This is the default
* behavior.
*/
CLASS,
/**
* 运行阶段
* Annotations are to be recorded in the class file by the compiler and
* retained by the VM at run time, so they may be read reflectively.
*
* @see java.lang.reflect.AnnotatedElement
*/
RUNTIME
}
三、@Documented
指定自定义注解是否能随着被定义的java文件生成到JavaDoc文档当中
四、@Inherited
指定某个自定义注解如果写在了父类的声明部分,那么子类的声明部分也能自动拥有该注解。@Inherited注解只对那些@Target被定义为ElementType.TYPE的自定义注解起作用。
自定义注解
一、定义注解
/**
* 自定义注解
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface myAnnotation {
public String value() default "";
}
二、配置注解
public class Student {
@myAnnotation("10")
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
三、解析注解
public class Test {
public static void main(String[] args) {
try {
//获取Student的Class对象
Class aClass = Class.forName("demo1.test.Student");
//获取构造器,创建一个Student实例
Constructor constructor = aClass.getConstructor();
Student student = (Student) constructor.newInstance();
//获取name属性
Field fields = aClass.getDeclaredField("name");
fields.setAccessible(true);
//判断name属性上是否有注解
if (fields.isAnnotationPresent(myAnnotation.class)){
//获取注解
Annotation annotation = fields.getAnnotation(myAnnotation.class);
//通过注解给name赋值
fields.set(student,((myAnnotation) annotation).value());
}
//打印student的name属性
System.out.println(student.getName());
} catch (Exception e) {
e.printStackTrace();
}
}
}
打印结果