如何解决如何深度修改复杂 Bean 中的属性?
我想更改出现在复杂 bean 中多个位置的自定义类型的属性。 使用 Java 8+、Spring……欢迎提出任何想法。
这是一个例子:
我想将给定 Holding
中每个人的工资设置为 42000)
:
class Employee {
String name;
int salary; // <-- I'd like to have an action on this field,everywhere
}
豆子:
class Holding {
Employee bigBoss;
List<Employee> workers;
Company partnership;
List<Company> ownedCompanies;
}
中间豆之一:
class Company {
Employee localBoss;
List<Employee> workers;
List<Company> childCompanies;
}
(所有这些都在同一个包 my.own.package
中并且有 setter/getter)
理想情况下,我正在寻找的签名应该是(不编译):
<T> deepModifyBean( T beanToModify,Class<?> propertiesToModify,* value supplier * ) ;
// and I would call it like :
Holding deepModifyBean( acmeBigCorp,Employee.class,(e -> e.setSalary( 42000 ) ) );
我尝试使用 Spring BeanWrapper
但最终未能正确设置它,因为我不明白它是否处理递归,以及它是否在反射上添加了任何内容。
所以这就是我想出的(也是一些递归函数)使用反射
<T> void recurseModify( T obj,int newSalary ) {
Class<?> clazz = obj.getClass();
// if it is neither a collection or one of our class => next
if ( ! Iterable.class.isAssignableFrom(clazz) && ! clazz.getPackageName().startsWith("my.own.package") )
return;
// for each field of the class,see what to do.
for (Field field : clazz.getDeclaredFields()) {
field.setAccessible(true); // to be able to read/write in it,bypass visibility...
Class<?> fieldType = field.getType();
// The one we want to modify
if (Employee.class.isAssignableFrom(fieldType)) {
Employee emp = (Employee) field.get(obj);
emp.setSalary( newSalary ); // overwrite salary
field.set(obj,emp);
// it is one of ours ? then it's worth checking the inside.
} else if (fieldType.getPackageName().startsWith("my.own.package")) {
recurseModify(obj,newSalary);
// go check in Lists
} else if (Iterable.class.isAssignableFrom(fieldType)) {
Iterator itr = ((Iterable) field.get(obj)).iterator();;
while (itr.hasNext()) {
recurseModify(itr.next(),newSalary);
}
}
}
}
我觉得读起来很困难,而且看起来像一个常见问题已经被其他人“以正确的方式”解决了。有没有更好的方法(必须有),使用最新的框架?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。