最近在因为在反射的使用过程中愈发觉得java的原生反射api在大部分的场景下比较繁琐。
于是换成了apache的反射包,感觉apache 的反射包爽多了。
以下是代码示例
实体类
@Data
@Accessors(chain = true)
public class StudentEntity {
private String name;
private int age;
public static StudentEntity create张三(){
return new StudentEntity().setName("张三").setAge(12);
}
public static StudentEntity create李四(){
return new StudentEntity().setName("李四").setAge(13);
}
}
首先使用java原生的反射api进行读取
public static int getAgeByNativeReflect() throws ReflectiveOperationException {
// 得到张三的年龄
StudentEntity studentEntity=StudentEntity.create张三();
// 通过原生反射获取张三的年龄
Class clazz=studentEntity.getClass();
Field field = clazz.getDeclaredField("age");
field.setAccessible(true);// 设置可读性
Object ageObj= field.get(studentEntity);
return (int) ageObj;
}
会发现模板代码非常多。
再来看看apache的反射包代码
public static int getAgeByApacheReflect() throws ReflectiveOperationException {
// 得到张三的年龄
StudentEntity studentEntity=StudentEntity.create张三();
return (int) FieldUtils.readDeclaredField(studentEntity,"age",true);
}
感觉整个页面都变得清爽起来了。
运行结果如下
apache设值代码亦如下所示:
FieldUtils.writeField(studentEntity,"age",15,true);