什么是注解(Annotation)
注解是 Java 5 的一个新特性。注解是插入你代码中的一种注释或者说是一种元数据(meta data)。这些注解信息可以在编译期使用预编译工具进行处理(pre-compiler tools),也可以在运行期使用 Java 反射机制进行处理。(来自极客学院)
注解作用
- 生成文档。常用的有@see @param @return 等
- 跟踪代码依赖性,实现替代配置文件功能。如spring注解配置
- 在编译时进行格式检查。如@override 放在方法前,如果你这个方法并不是覆盖了超类方法,则编译时就能检查出。
元注解
四个元注解:@Target, @Retention, @Documented, @Inherited
@Target
表示注解可以用于什么地方, ElementType 枚举类定义了使用范围如下。
TYPE //类、接口或enum声明
FIELD //域(属性)声明
METHOD //方法声明
PARAMETER //参数声明
CONSTRUCTOR //构造方法声明
LOCAL_VARIABLE //局部变量声明
ANNOTATION_TYPE //注释类型声明
PACKAGE //包声明
TYPE_PARAMETER //类型参数声明,下面这两个是1.8新增
TYPE_USE //类型使声明
@Retention
表示在什么级别保存该注解信息。可选的参数值在枚举类型 RetentionPolicy 中,如下所示。
RetentionPolicy.SOURCE //注解将被编译器丢弃
RetentionPolicy.CLASS //注解记录在class文件中,但在VM运行期不会被保留,这个是默认行为
RetentionPolicy.RUNTIME //注解记录在class文件,并且VM将在运行期也保留注释,因此可以通过反射机制读取注解的信息。
@Documented
将此注解包含在Javadoc中
@Inherited
使父类的注解可以继承至子类中,注意注解继承只针对class级别注解有效
自定义注解demo
/***********************类注解StudentInfo****/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface StudentInfo {
String value() default "";
}
/*********************属性注解StudentInfo****/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface StudentName {
String value() default "";
}
/******************************注解使用****/
@StudentInfo("studentInfo")
public class Student {
@StudentName("lily")
private String name;
private String age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public static void main(String[] args){
if(Student.class.isAnnotationPresent(StudentInfo.class)){
System.out.println(Student.class.getAnnotation(StudentInfo.class).value());
}
Field[] fields = Student.class.getDeclaredFields();
for(Field field : fields){
if(field.isAnnotationPresent(StudentName.class)){
StudentName studentName = field.getAnnotation(StudentName.class);
System.out.println(studentName.value());
}
}
}
}