Java 注解概论
注解可以简化主流程代码,具体分为以下3个方面:
1.生成文档,在注释中随处可见,例如 @param
,@return
等;
2.代替配置文件,Spring 框架经常使用注解来代替XML配置文件,精简代码结构;
3.编译时进行格式检查,例如 @Override
;
1. 定义注解
所有注解都继承了 Annotation
接口,但不是采用 implement 关键字实现,而是用 @interface
声明接口来实现继承的逻辑,表示这是一个注解。例如,常见的 @Override
注解。
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
2. Java8元注解
元注解表示加在注解上的注解。
2.1 @Target
@Target
表示注解的作用域,共有以下几种类型:
- TYPE:表示注解可以加在类、接口、注解或枚举类上;
- FIELD:表示注解可以加在类的变量上;
- METHOD:表示注解可以加在方法上;
- PARAMETER:表示注解可以加在方法的参数上;
- CONSTRUCTOR:表示注解可以加在构造方法上;
- LOCAL_VARIABLE:表示注解可以加在局部变量上;
- ANNOTATION_TYPE:表示注解可以加在注解上(套娃);
- PACKAGE:表示注解可以加在包上;
- TYPE_PARAMETER:表示注解可以加在任何声明类型的地方;
- TYPE_USE:表示注解可以加在任何使用类型的地方。
2.2 @Retention
@Retention
表示注解的生命周期,共有以下3种类型:
- SOURCE:表示注解在编辑结束之后就被丢弃,主要用于编译时的格式检查使用,例如
@Override
; - CLASS:表示注解在类加载进虚拟机之后被丢弃,默认的类型;
- RUNTIME:表示注解在程序运行时也会存在,即不会被丢弃,可以通过反射读取。
2.3 @Documented
@Documented
表示是否将注解信息放入 javadoc 文档。
2.4 @Inherited
@Inherited
表示注解能够被继承。
2.5 @Repeatable
@Repeatable
表示注解能够重复添加。
3 注解实战
利用类的成员变量上的注解给变量赋值
3.1 自定义注解
@Documented
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String value() default "";
}
3.2 类的定义
利用反射,调用类无参构造器时,会给类的成员变量赋注解指定的值。
@Data
public class Employee {
@MyAnnotation("yasoo")
private String name;
@MyAnnotation("happy_wind_man")
private String nickName;
public Employee() {
Class<Employee> clazz = Employee.class;
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
MyAnnotation myAnnotation = field.getAnnotation(MyAnnotation.class);
field.setAccessible(true);
try {
field.set(Employee.this, myAnnotation.value());
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Employee employee = new Employee();
System.out.printf("The employee's name is %s, everybody call him %s.",
employee.getName(), employee.getNickName());
}
}