0

如果它的值不为空,我想比较 2 个对象并使用第二个对象的值创建一个新对象。否则,第一个值应该被复制到创建的对象中。我的问题是我不知道如何设置要复制的值。我知道要获取我可以使用的属性的名称field.getName(),但是如何在新对象上设置该属性?

例子:

Test t1 = new Test();
t1.name = "Maria";
t1.age = 30;
t1.street = "somewhere";

Test t2 = new Test();
t2.name = "Maria";
t2.age = ;
t2.street = "here and here";

Test resultIwant = new Test();
t2.name = "Maria";
t2.age = 30;
t2.street = "here and here";

代码:

Test resultIwant = new Test(t2);

for(Field field : t1.getClass().getDeclaredFields()) {
    field.setAccessible(true);
    Object value1= field.get(t1);
    Object value2= field.get(t2);

    if ((value2 == null && value1 == null) || (value2 == value1))
        continue;
    else {
        if(value2 != null && value1 == null)
            continue;
        else if(value2 == null && value1 != null) {
            resultIwant.set???? = value1; <----------- this is my problem
        }
    }
}   
4

1 回答 1

0

Java 反射 API 不仅允许您读取,还允许您设置字段值。

在您的代码中,您可以尝试以下操作:

Test resultIwant = new Test(t2);

for(Field field : t1.getClass().getDeclaredFields()) {
        field.setAccessible(true);
        Object value1= field.get(t1);
        Object value2= field.get(t2);
        
        if ((value2 == null && value1 == null) || (value2 == value1)) 
            continue;
        else {
            if(value2 != null && value1 == null)
                continue;
            else if(value2 == null && value1 != null) {
               String fieldName = field.getName();
               Field fieldOnResultIwant = 
                 resultIwant.getClass().getDeclaredField(fieldName);
               fieldOnResultIwant.setAccessible(true);
               // Honestly, I do not remember... Perhaps also will work:
               // field.set(resultIwant, value1);
               fieldOnResultIwant.set(resultIwant, value1);
            }
        }
        
    }  

我在这里发布了一个更完整但相关的答案。

于 2020-12-30T12:21:29.980 回答