繁体   English   中英

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

[英]How to copy a subset of properties from Bean A to Bean B in 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)如果我正确的话,请使用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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM