注解解析器 : 通过反射操作注解
案例: 自定义水果清单 FruitList
int apple;
int pair;
为每种水果提供一个默认的进货数量,通过注解进行配置
注解类型: FruitNum 属性: int value();
注意:
如果通过反射操作注解,注解类型的生命周期应该定义为运行期
public static void main(String[] args) throws Exception {
FruitList list = new FruitList();
list.apple=200;
System.out.println(list);
testFruitList(list,FruitList.class);
System.out.println(list);
}
//注解解析器
public static FruitList testFruitList(FruitList list,Class<FruitList> cls) throws Exception {
//1.获取所有属性
Field[] arr = cls.getDeclaredFields();
//2.判断当前对象的每一个属性值
for(Field field:arr){
Object value = field.get(list);
//是否==null,如果不等于 略过 如果==null 1)获取当前成员变量上的注解对象, 2)获取到实现 3)赋值
if(value==null){
//判断当前属性上是否存在FruitNum注解修饰
if(field.isAnnotationPresent(FruitNum.class)){
//获取当前属性上的FruitNum注解实例
FruitNum fruitNum = field.getAnnotation(FruitNum.class);
System.out.println(fruitNum.value());
//为当前属性赋值,值为成员上的注解上配置的实参
field.set(list,fruitNum.value());
}
}
}
return list;
}
}
class FruitList{
@FruitNum(50)
Integer apple;
@FruitNum
Integer pair;
@Override
public String toString() {
return "FruitList{" +
"apple=" + apple +
", pair=" + pair +
'}';
}
}
//水果数量
@Retention(RetentionPolicy.RUNTIME)
@interface FruitNum{
int value() default 20;
}