I have two java objects and I want to merge them into single object. Problem is the two objects does not contain plain primitive type properties(fields) they contain complex
try this
public T objectMerge(T local, T remote, boolean toappend) throws Exception {
Class> clazz = local.getClass();
Object merged = clazz.newInstance();
for (Field field : clazz.getDeclaredFields()) {
field.setAccessible(true);
Object localValue = field.get(local);
Object remoteValue = field.get(remote);
if (localValue != null) {
String key = "";
if (localValue.getClass().getSimpleName().toLowerCase().contains("map")) {
key = "map";
} else if (localValue.getClass().getSimpleName().toLowerCase().contains("set")) {
key = "set";
} else if (localValue.getClass().getSimpleName().toLowerCase().contains("list")) {
key = "list";
} else {
key = localValue.getClass().getSimpleName();
}
switch (key) {
case "Default":
case "Detail":
case "String":
case "Date":
case "Integer":
case "Float":
case "Long":
case "Double":
case "Object":
field.set(merged, (remoteValue != null) ? remoteValue : localValue);
break;
case "map":
if (toappend) {
((Map) localValue).putAll((Map) remoteValue);
} else {
localValue = (remoteValue != null) ? remoteValue : localValue;
}
field.set(merged, localValue);
break;
case "list":
if (toappend) {
((List) localValue).addAll((List) remoteValue);
} else {
localValue = (remoteValue != null) ? remoteValue : localValue;
}
field.set(merged, localValue);
break;
case "set":
if (toappend) {
((Set) localValue).addAll((Set) remoteValue);
} else {
localValue = (remoteValue != null) ? remoteValue : localValue;
}
field.set(merged, localValue);
break;
default:
field.set(merged, this.objectMerge(localValue, remoteValue, toappend));
break;
}
}
}
return (T) merged;
}