比较对象并创建一个与其中一个相似的新对象
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);
}
}
}
我发布了一个更完整但相关的答案 。
我想比较 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);
}
}
}
我发布了一个更完整但相关的答案