in src/main/java/com/googlesource/gerrit/plugins/task/TaskConfig.java [95:122]
protected <T> void copyDeclaredFields(Class<T> cls, T from) {
for (Field field : cls.getDeclaredFields()) {
try {
field.setAccessible(true);
Class<?> fieldCls = field.getType();
Object val = field.get(from);
if (field.getType().isPrimitive()
|| Primitives.isWrapperType(fieldCls)
|| (val instanceof String)
|| val == null) {
field.set(this, val);
} else if (val instanceof List) {
List<?> list = List.class.cast(val);
field.set(this, new ArrayList<>(list));
} else if (val instanceof Map) {
Map<?, ?> map = Map.class.cast(val);
field.set(this, new HashMap<>(map));
} else if (field.getName().equals("this$0")) { // Don't copy internal final field
} else {
throw new RuntimeException(
"Don't know how to deep copy " + fieldValueToString(field, val));
}
} catch (IllegalAccessException e) {
throw new RuntimeException(
"Cannot access field to copy it " + fieldValueToString(field, "unknown"));
}
}
}