注解
定义
注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。
通俗的说就是一个标签,使用这个标签来对要标记的对象做说明,主要是与Java中的反射想结合来使用。
public @interface Name {
String value() default "";
}
元注解
注释注解的注解
包括 @Target @Retention @Document @Inherited四种。
@Target 定义注解的作用目标
@Target(ElementType.TYPE) //接口、类、枚举、注解
@Target(ElementType.FIELD) //字段、枚举的常量
@Target(ElementType.METHOD) //方法
@Target(ElementType.PARAMETER) //方法参数
@Target(ElementType.CONSTRUCTOR) //构造函数
@Target(ElementType.LOCAL_VARIABLE)//局部变量
@Target(ElementType.ANNOTATION_TYPE)//注解
@Target(ElementType.PACKAGE) ///包
@Retention 说明该注解保持的时间
@Retention(RetentionPolicy.SOURCE) //注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;
@Retention(RetentionPolicy.CLASS) //注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期;
@Retention(RetentionPolicy.RUNTIME) //注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在;
由于一般注解都会配合着反射来使用,故一般将其设置为 RUNTIME
@Document 说明该注解将被包含在javadoc中
@Inherited 说明子类可以继承父类中的该注解
举例说明:
//定义一个@Name注解
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Name {
String value() default "";
}
//定义一个Person类,并使用@Name注解
public class Person {
@Name("卡卡罗特")
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
//测试
@Test
public void testAnnotation(){
try {
Name name = Person.class.getDeclaredField("name").getAnnotation(Name.class);
System.out.println(name.value());
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
}