基本上我正在寻找的是一个简单的方法,如:
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)
如果我是正确的)将它们设置为公共,要么通过它们的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)