【问题标题】:Efficient way to copy all bean properties into another bean [duplicate]将所有bean属性复制到另一个bean的有效方法[重复]
【发布时间】:2016-12-04 13:26:51
【问题描述】:

我正在尝试将所有属性从一个 bean 复制到另一个:

public void copy(MyBean bean){
    setPropertyA(bean.getPropertyA());
    setPropertyB(bean.getPropertyB());
    [..]
}

如果你的 bean 有很多属性,这很容易出错并且要写很多东西。

我正在考虑通过反射来做到这一点,但我无法将 getter 从一个对象“连接”到另一个对象的 setter。

public List<Method> getAllGetters(Object object){
    List<Method> result = new ArrayList<>();
    for (final PropertyDescriptor propertyDescriptor : Introspector.getBeanInfo(object.getClass()).getPropertyDescriptors()) {
    result.add(readMethod = propertyDescriptor.getReadMethod());
    }
    return result;
}

编辑

 BeanUtils.copyProperties(this, anotherBean);

按预期工作!

【问题讨论】:

  • 反射是防错的?
  • @GurwinderSingh,感谢您的宝贵意见。
  • 我在一些项目中使用过OrikaDozer。但是,我会使用手动映射器。这不是那么困难,也不是那么容易出错。这些工具(Orika 和 Dozer)要么需要配置,要么让您的代码依赖于任意约定,虽然它们有帮助,但我认为为此付出的代价非常高。

标签: java javabeans


【解决方案1】:

考虑使用Apache BeanUtilsSpring's BeanUtils。他们都有一个copyProperties() 方法,可以做你想做的事。

还可以想象,JDK's Object.clone() 将为您提供所需的结果。请务必查看 Javadoc 和 this SO post,以便了解其局限性。

【讨论】:

    【解决方案2】:

    如果您想手动执行此操作,我建议使用所谓的“序列化副本”。一个限制是 bean 大多数实现 Serializable 接口。正如您所说,可以使用反射来完成,但您可能会遇到更多不便。 希望对您有所帮助。

    【讨论】:

    • 这里并不适用。序列化复制是一种克隆/深度复制的策略。它不适用于获取一个对象并将其复制到另一个不同类的对象。 BeanUtils,或者使用反射滚动你自己的,是合适的选择。序列化副本在这里开始有用的唯一方法是,如果定义了具有公共成员的新 bean,使其成为两个 bean 的成员,并且将 getter 和 setter 委托给它以维护当前的简单 bean 接口。然后就可以复制了。但这比需要的要复杂。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-31
    • 1970-01-01
    • 2012-11-19
    • 1970-01-01
    • 2017-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多