java bean对象之间复制属性

在现在的企业级Java应用程序中, Java Bean被广泛的应用。 一堆的相关的划分也应运而生, 如DTO, DAO, BO, POJO, VO等。这里不去管这些概念的细节, 如果你感兴趣,可以google之, 比如这篇文章。 这里要讨论的问题是如何在不同的Java Bean对象之间复制它们的属性?
这有几种情况需要考虑:

  • 源对象和目标对象的类型可能不同
  • 只想复制部分的对象
  • 要复制的对象的属性名字不同
  • 如何实现深复制 (deep copy)?

目前有几个Bean copy库可以使用:

Dozer

Dozer是一个功能强大的Bean复制库。 你可以通过Annotation, API或者XML定义Map规则。 XML是最简单,修改方便,非侵入的方式。
除了最简单不同类型,不同属性名称的转换外, Dozer还支持:

  • 不同类型属性之间的转换,如字符串转为日期类型。 或者定制的类型转换
  • 枚举类型
  • 集合属性复制,并且支持Array,List,Set之间的转换
  • Map类型的转换
  • 索引属性
  • 深拷贝
  • 部分复制
  • 单向复制
  • 表达式
  • ...

除此之外, 它还提供了Spring, JMX, JAXB的集成。

如果,实际上大部分,我们不需要这么强大的功能。 比如我们可能只是需要一个clone的功能。 你可以考虑使用 Apache common-beanutils和Spring BeanUtils类。

Apache common-beanutils

BeanUtils 类提供了两个转换方法:

1
2
static void copyProperties(Object dest, Object orig)
static void copyProperty(Object bean, String name, Object value)

第二个方法用来复制一个特定的属性。
属性名字必须一样, 类型不一样可能执行默认的数据转换。 执行浅复制。

它还提供了一个clone方法。

1
static Object cloneBean(Object bean)

Spring BeanUtils

Spring BeanUtils提供了更多的功能。

1
2
3
4
5
6
static void copyProperties(Object source, Object target)
Copy the property values of the given source bean into the target bean.
static void copyProperties(Object source, Object target, Class<?> editable)
Copy the property values of the given source bean into the given target bean, only setting properties defined in the given "editable" class (or interface).
static void copyProperties(Object source, Object target, String... ignoreProperties)
Copy the property values of the given source bean into the given target bean, ignoring the given "ignoreProperties".

你可以指定要复制的属性 (第二种方法)或者排除部分属性(第三种方法)