如何将所有属性的值从对象的一个实例复制到另一个实例(如果它们不是null或空)



给定一个类Person:

String name;
String surname;
String id;
String address;

我有一个对象obj1,其值如下:

name="Name"
surname=null
id="ABC123"
address="Here"

通过一个api调用,我得到了以下json:

{
"name":"John",
"surname":"Doe",
"id":"A1B2C3"
}

它被映射到像这样的对象CCD_ 2:

name="John"
surname="Doe"
id="A1B2C3"
address=null

我想将obj2的所有非null(或空字符串(值复制到obj1中,所以最终结果是:

name="John"
surname="Doe"
id="A1B2C3"
address="Here"

我有两个问题。第一个问题是,我不想为对象的每个属性手动键入get/set调用。第二个问题是,我希望该方法适用于任何类型的对象,而不进行任何更改或更改很少。

至少,我需要解决第一个问题。第二个是可选的,但也可以学习解决方案。

您可以使用反射来获取所有实例字段,并使用Field#set来复制非null值。

try {
for (Field field : Person.class.getDeclaredFields()) {
if (!Modifier.isStatic(field.getModifiers())) {
field.setAccessible(true);
Object val = field.get(obj2);
if (val != null) {
field.set(obj1, val);
}
}
}
System.out.println(obj1);
} catch (IllegalAccessException e) {
// Handle exception
}

演示

public static void main(String[] args) {
MyClass obj1 = new MyClass(1,"1");
MyClass obj2 = new MyClass(2,"2");
System.out.println(obj2);
copy(obj1, obj2);
System.out.println(obj2);
}
public static MyClass copy(MyClass obj1, MyClass obj2){
Arrays.stream(obj1.getClass().getDeclaredFields()).forEach(f -> {
try {
f.set(obj2, f.get(obj1));
} catch (IllegalAccessException e) {
e.printStackTrace();
}
});
return obj2;
}
static class MyClass {
int myInt;
String myString;
String emptyString = null;
public MyClass(int myInt, String myString) {
this.myInt = myInt;
this.myString = myString;
}
@Override
public String toString() {
return "MyClass{" +
"myInt=" + myInt +
", myString='" + myString + ''' +
", emptyString='" + emptyString + ''' +
'}';
}
}

如果你有私人字段,你可以使用

f.setAccessible(true);

但我不建议这么做。

阅读您的问题时,您似乎有两个类,位于两个不同的项目中,它们在json中交换信息。

所以,如果你可以使用Jackson(春季默认(,这很容易

您可以使用jackson@JsonInclude(JsonInclude.Include.NON_NULL)的注释来注释目标类

最新更新