如何使用 Spring [SpEL] 将一个 Java 对象的属性合并到 Java 中的另一个对象?

how to merge properties from one Java object to another in Java using Spring [SpEL]?

我正在使用 Spring 但不是很熟悉它的所有功能。寻找一种将字段从一个 Java 对象实例复制到另一个对象实例的好方法。我看过 How to copy properties from one Java bean to another? 但我要找的更具体,所以这里是详细信息:

假设我有一些 class P 的两个实例,源和目标,它们有 getter 和 setter a、b、c、d 和其他 20 个。 我想将源的属性复制到目标中,但仅限于 属性 名称列表中的所有属性。源或目标中任何 属性 的值是多少都没有关系。
换句话说,如果列表是 {"a", "b"}
然后我只想发生以下情况:

P source;
P target;
List<string> properties; 

//source, target are populated. properties is {"a", "b"}  
//Now I need some Spring (SpEL?) trick to do the equivalent of:
target.setA(source.getA());
target.setB(source.getB());

我觉得这里不需要SpEL,可以用BeanUtils.copyProperties(Object, Object, String...)解决。根据您的示例,如果您的 class 具有属性 'a'、'b'、'c' 并且您只想复制前两个,则可以这样调用它

BeanUtils.copyProperties(source, target, "c");

希望对您有所帮助!

使用Java反射:

Field[] fields = source.getClass().getDeclaredFields();

for (Field f: fields) {
    if (properties.contains(f.getName())) {

        f.setAccessible(true);

        f.set(destination, f.get(source));
    }
}

这里有一些关于反射的教程:

http://www.oracle.com/technetwork/articles/java/javareflection-1536171.html

http://tutorials.jenkov.com/java-reflection/index.html

不过要小心,Reflection has specific use cases


使用 Spring BeanWrapper:

BeanWrapper srcWrap = PropertyAccessorFactory.forBeanPropertyAccess(source);
BeanWrapper destWrap = PropertyAccessorFactory.forBeanPropertyAccess(destination);

properties.forEach(p -> destWrap.setPropertyValue(p, srcWrap.getPropertyValue(p)));

Spring BeanWrapper 示例的功劳转到: