微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何深度修改复杂 Bean 中的属性?

如何解决如何深度修改复杂 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 举报,一经查实,本站将立刻删除。