如何在Java中将属性子集从Bean a复制到Bean B

  • 本文关键字:Bean 复制 子集 属性 Java java
  • 更新时间 :
  • 英文 :


基本上我正在寻找的是一个简单的方法,如:

BeanUtils.copyProperties(dest, orig);

这来自apache,但将所有属性从源复制到目标。我需要一些只会复制某个属性子集的东西…如下所示

String[] propertyNamesToCopy = {"firstName", "lastName"};
BeanUtils.copyProperties(dest, orig, propertyNamesToCopy);

有什么建议吗?

您可以使用BeanUtils中的copyProperty来复制单个属性。只要循环你的属性并使用它。您可以将其提取到一个方法中。

你可以用反射来做。

public void copyProperties(Object orig, Object dest, String[] props){
    Class<?> class = orig.getClass().getFields();
    for(String fieldName : props){
       Field field = class.getField( fieldName );
       field.set(dest, field.get(orig));
    }
}

我没有尝试过,您使用这种方法可能会遇到一些问题。

首先,您需要添加try/catch,以防字段不存在。那么它只适用于public场。此外,Fieldget()方法只返回对象,我不知道它是否会自动装箱/拆箱,这可能会产生运行时错误,并迫使您使用getInt()等……取决于FieldType(您可以通过field.getGenericType()获得它)。您可能会看到getDeclaredField()获取所有字段(甚至私有),但仅针对您拥有的类,而不是继承自父类的字段。

如果你想访问私有字段,要么使用反射(field.setaccessible(true)如果我是正确的)将它们设置为公共,要么通过它们的getter和setter(也使用反射)访问它们:

Method get = class.getMethod("get"+fieldNameWithCaps); 
Object newValue = get.invoke(orig)
Method set = class.getMethod("set"+fieldNameWithCaps, newValue.getClass()); 
set.invoke(dest, newValue);

仍然不确定这里,因为我不知道什么newValue.getClass()将返回,但你得到的想法。试着看看周围的反射,但要小心,这是相当缓慢的,可以是混乱的。

Spring中的BeanUtils类基本上提供了与我所寻找的相反的功能。所以我取所有属性的列表-复制属性列表以获得忽略列表,但它有效:-)

org.springframework.beans.BeanUtils.copyProperties(Object source, Object target, String... ignoreProperties)

最新更新