Существует динамическое решение для объединения любых двух объектов, которые требуют отражения и рекурсии.
public <T> T merge(T local, T remote, ArrayList<String> listOfClass)
throws IllegalAccessException, InstantiationException {
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) {
if (listOfClass.contains(localValue.getClass().getSimpleName())) {
field.set(merged, this.merge(localValue, remoteValue, listOfClass));
} else {
field.set(merged, (remoteValue != null) ? remoteValue : localValue);
}
} else if (remoteValue != null) {
field.set(merged, remoteValue);
}
}
return (T) merged;
}
Переменная Описание:
- local: объект, к которому будет добавлен другой
- remote: объект, который будет объединен с локальным объектом
- listOfClass: ArrayList пользовательских классов в данном объекте
Функция возвращает объединенный объект, который можно использовать.
Престижность! :)