什么是注解(Annotation)
- Annotation是代码中的特殊标记。
- Annotation可以像修饰符一样被使用,用于修饰包、类、构造器、方法、成员变量、参数、局部变量的声明。
- 在JavaSE中注解使用目的比较简单。例如标记过时的功能、忽略警告等。在JavaEE/Android中占据了更重要的角色。例如用来配置应用程序,代替JavaEE旧版中所遗留的繁冗的代码和XML配置
- 【注解】和【XML】是两种不同的配置模式,各有各的优劣,注解可以提供更大的便捷性,易于维护修改,但耦合度高,而 【XML】 相对于注解则是相反的。追求低耦合就要抛弃高效率,追求效率必然会遇到耦合。目前,许多框架将【XML】和【注解】两种方式结合使用,平衡两者之间的利弊。
- 框架 = 注解 + 反射 + 设计模式。
注解的用途
- 生成文档。通过代码里标识的元数据生成javadoc文档。
- 编译检查。通过代码里标识的元数据让编译器子啊编译期间进行检查验证。
- 编译时动态处理。编译时通过代码里标识的元数据动态处理,例如动态生成代码。
- 运行时动态处理。运行时通过代码里标识的元数据动态处理,例如使用反射注入实例。
注解的分类
- Java自带的标准注解 ,包括@Override(标明重写某个方法)、@Deprecated(标明某个类或方法过时)和@SuppressWarnings(标明要忽略的警告),使用这些注解后编译器就会进行检查。
- 元注解 ,元注解是用于定义注解的注解,包括@Retention(标明注解被保留的阶段)、@Target(标明注解使用的范围)、@Inherited(标明注解可继承)、@documented(标明是否生成javadoc文档)。
- 自定义注解 ,可以根据自己的需求定义注解。
示例
package com.annotation_learning;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Field;
public class test_annotation {
public static void main(String[] args) throws IllegalArgumentException, ReflectiveOperationException{
Person p = new Person("1231asdas"); // 超过了最大长度
for (Field field : p.getClass().getFields()) {
Range range = field.getAnnotation(Range.class);
if (range!=null) {
Object value = field.get(p);
if (value instanceof String) {
String s = (String) value;
if(s.length() < range.min() || s.length() > range.max()) {
throw new IllegalArgumentException("Invalid field: " + field.getName());
}
else {
System.out.println("没有越界");
}
}
}
}
}
}
class Person {
@Range(min = 1, max = 5)
public String name;
public Person(String name) {
this.name = name;
}
}
@Retention(RetentionPolicy.RUNTIME) // 生命周期-整个RUNTIME
@Target(ElementType.FIELD) // 限制运用的场景
@interface Range {
int min() default 0;
int max() default 255;
}