如何在Java中将Bean A的属性子集复制到Bean B?

时间:2015-08-17 12:12:31

标签: java

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

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

这来自apache但将所有属性从原始位置复制到目标位置。我需要的东西只会复制某个属性的子集...类似于以下

pptObj = { "A":1, "B":2, "C":3 }; 

有什么建议吗?

3 个答案:

答案 0 :(得分:0)

您可以使用BeanUtils中的{{1}}复制单个属性。只需遍历您的属性并使用它。您可以将其提取到方法中。

答案 1 :(得分:0)

你可以用反射来做。

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字段。此外,get()方法表单Field仅返回对象,我不知道它是否会自动装箱/取消装箱,这可能会产生运行时错误并迫使您使用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()会返回什么,但你明白了。尝试环顾反射,但要小心,它很慢,可能很乱。

答案 2 :(得分:0)

Spring的BeanUtils类提供了与我想要的相反的功能。所以我获取所有属性的列表 - 要复制的属性列表以获取忽略列表,但它可以工作: - )

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