比较对象并创建一个与其中一个相似的新对象

Compare objects and create a new one similar to one of them

我想比较 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
        }
    }
}   

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);
            }
        }
        
    }  

我发布了一个更完整但相关的答案