我有两个相同类型的对象。我想创建一个方法,它可以合并两个对象的属性,并且可以返回一个对象。
例如: 考虑具有4个字段的ABC类
Class ABC{
String name;
String id;
String salary;
String status;
}
假设第一个对象是
ABC[name=ZEE,id=2,salary=null,status=1]
,第二个对象是
ABC[name=john,id=null,salary=12200,status=null]
我想创建一个可以合并这两个对象的泛型方法,并可以将结果输出为:
ABC[name=ZEE,id=2,salary=12200,status=1]
该方法应采用对象类型的两个参数:
Object mergeObject(Object Obj1, Object Obj2){
}
注意:如果两个对象都具有该属性的非null值,则将采用第一个对象属性。
答案 0 :(得分:12)
你必须走反射路线。我假设您拥有默认构造函数,否则以下内容无法正常工作。此外,它需要两种相同的类型。它不会复制继承的字段,为此,您还需要添加here中的一些代码。
@SuppressWarnings("unchecked")
public static <T> T mergeObjects(T first, T second) throws IllegalAccessException, InstantiationException {
Class<?> clazz = first.getClass();
Field[] fields = clazz.getDeclaredFields();
Object returnValue = clazz.newInstance();
for (Field field : fields) {
field.setAccessible(true);
Object value1 = field.get(first);
Object value2 = field.get(second);
Object value = (value1 != null) ? value1 : value2;
field.set(returnValue, value);
}
return (T) returnValue;
}
这是一个例子
public static class ABC {
private int id;
private String name;
private int[] numbers;
public ABC() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int[] getNumbers() {
return numbers;
}
public void setNumbers(int[] numbers) {
this.numbers = numbers;
}
}
public static void main(String[] args) throws InstantiationException, IllegalAccessException {
ABC abc = new ABC();
abc.setId(1);
abc.setName("Hello");
int[] newnumbers = new int[5];
for(int i = 0; i < newnumbers.length; i++) {
newnumbers[i] = i;
}
abc.setNumbers(newnumbers);
ABC abc2 = new ABC();
abc2.setName("World");
ABC abcFinal = mergeObjects(abc, abc2);
System.out.println("Properties of ABC Final:");
System.out.println("ID: " + abcFinal.getId());
System.out.println("Name: " + abcFinal.getName());
System.out.println("Numbers: " + Arrays.toString(abcFinal.getNumbers()));
}
输出:
Properties of ABC Final:
ID: 1
Name: Hello
Numbers: [0, 1, 2, 3, 4]
答案 1 :(得分:2)
如果您要创建新的Object,请使用:
public ABC mergeABC(ABC obj1, ABC obj2){
ABC retVal = new ABC();
retVal.name = ((obj1.name != null) ? obj1.name : obj2.name );
retVal.id = ((obj1.id != null) ? obj1.id : obj2.id );
retVal.salary = ((obj1.salary != null) ? obj1.salary : obj2.salary );
retVal.status = ((obj1.status != null) ? obj1.status : obj2.status );
return retVal;
}
如果你想&#34;重复使用&#34; obj1或obj2,只需将其用作返回值。
答案 2 :(得分:-1)
如果你想一般性地做,你唯一的选择就是反思。
答案 3 :(得分:-1)
如果你想优先考虑对象1中的值(如果两个对象都有值),那么按照这样的方式进行..
private CustomObject mergeObject(CustomObject Obj1, CustomObject Obj2) {
CustomObject tempObject = new CustomObject();
If (Obj1.getName() == null) {
tempObject.setName(Obj2.getName());
} else {
tempObject.setName(Obj1.getName());
}
return tempObject;
}
迭代对象中每个参数的if语句。