有用なメソッドが見つかりましたhere
ですが、配列メンバーのクラスでは機能しません。Reflection APIを使用して、生成されたfinalクラスのオブジェクトのディープコピーを作成する方法
public class Test {
int [] arr = new int[2];
}
新しい配列をインスタンス化するために私の失敗の試みで
上記の回答から
全コード:
public static Object cloneObject(Object _obj) {
try {
// begin my changes
Object copy = null;
if (!_obj.getClass().isArray())
copy = _obj.getClass().newInstance();
else {
int len = Array.getLength(_obj);
Class type = _obj.getClass().getComponentType();
// Next line fails with: Compiler(syntax) error
// copy = (type.getClass()[])Array.newInstance(_obj.getClass(), len);
// Next line fails with: "InstantiationException: int cannot be instantiated"
// copy = _obj.getClass().getComponentType().newInstance();
// how then?
}
// end my changes
for (Field field : _obj.getClass().getDeclaredFields()) {
field.setAccessible(true);
if (field.get(_obj) == null || Modifier.isFinal(field.getModifiers()))
continue;
if (field.getType().isPrimitive() ||
field.getType().equals(String.class) ||
field.getType().getSuperclass().equals(Number.class) ||
field.getType().equals(Boolean.class)
)
field.set(copy, field.get(_obj));
else {
Object child = field.get(_obj);
if (child == _obj)
field.set(copy, copy);
else
field.set(copy, cloneObject(field.get(_obj)));
}
}
return copy;
} catch (Exception _e){
return null;
}
}
を達成することも可能ですか?
今ではライン 'field.setに失敗する(コピー、cloneObject(field.get(_obj)));' 'IllegalArgumentException:"フィールドでTest.arrにint []型があります。int [] [] "' –
@AlexeyAndronovあなたの変更について質問したところ、私はあなたの質問に答えました。その部分が今働いていると思われるので、正しい答えだと思います。新しい質問がある場合は、別の質問としてそれを聞いてください。 –
@Alexey Andronov: 'Array.newInstance'はコンポーネントタイプを想定しているので、' _obj.getClass() 'ではなく、この答えのように' type'を使用する必要があります。しかし、これはコピーではなく、同じタイプの新しい配列を作成するだけであることに注意してください。 – Holger