基本上我正在寻找的是一种简单的方法,如:
String[] propertyNamesToCopy = {"firstName", "lastName"};
BeanUtils.copyProperties(dest, orig, propertyNamesToCopy);
这来自apache但将所有属性从原始位置复制到目标位置。我需要的东西只会复制某个属性的子集...类似于以下
pptObj = { "A":1, "B":2, "C":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)