[英]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
领域。 另外,表单Field
的get()
方法仅返回对象,我不知道它是否会自动装箱/拆箱,这可能会生成运行时错误并迫使您使用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.