任意のクラスのオブジェクトのディープ コピーの最適なソリューションは、オブジェクト内のオブジェクトを処理するための再帰があり、実際の GET および SET 関数を使用してオブジェクトの整合性を維持することです。
私が提唱したい解決策は、ソース オブジェクトのすべての GET 関数を見つけて、それらをターゲット オブジェクトの SET 関数と一致させることです。ReturnType -> Parameter で一致する場合は、コピーを実行します。それらが一致しない場合は、それらの内部オブジェクトのディープ コピーを呼び出してみてください。
private void objectCopier(Object SourceObject, Object TargetObject) {
// Get Class Objects of Source and Target
Class<?> SourceClass = SourceObject.getClass();
Class<?> TargetClass = TargetObject.getClass();
// Get all Methods of Source Class
Method[] sourceClassMethods = SourceClass.getDeclaredMethods();
for(Method getter : sourceClassMethods) {
String getterName = getter.getName();
// Check if method is Getter
if(getterName.substring(0,3).equals("get")){
try {
// Call Setter of TargetClass with getter return as parameter
TargetClass.getMethod("set"+getterName.substring(3), getter.getReturnType()).invoke(TargetObject, getter.invoke(SourceObject));
}catch(IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException e) {
try {
// Get Class of the type Setter in Target object is expecting
Class<?> SetTargetClass = TargetClass.getMethod(getterName).getReturnType();
// Create new object of Setter Parameter of Target
Object setTargetObject = SetTargetClass.newInstance();
// Copy properties of return object of the Source Object to Target Object
objectCopier(getter.invoke(SourceObject), setTargetObject);
// Set the copied object to the Target Object property
TargetClass.getMethod("set"+getterName.substring(3),SetTargetClass).invoke(TargetObject, setTargetObject);
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException
| NoSuchMethodException | SecurityException | InstantiationException ef) {
System.out.println(getterName);
}
}
}
}
}