如何在Java中復(fù)制對象?請考慮以下代碼:DummyBean dum = new DummyBean();dum.setDummy("foo");System.out.println(dum.getDummy()); // prints 'foo'DummyBean dumtwo = dum;System.out.println(dumtwo.getDummy()); // prints 'foo'dum.setDummy("bar");System.out.println(dumtwo.getDummy()); // prints 'bar' but it should print 'foo'所以,我想復(fù)制dum到dumtwo并更改dum而不影響dumtwo。但上面的代碼并沒有這樣做。當(dāng)我改變某些內(nèi)容時(shí)dum,也會發(fā)生同樣的變化dumtwo。我想,當(dāng)我說dumtwo = dum,Java 只復(fù)制引用。那么,有沒有辦法創(chuàng)建一個(gè)新的副本dum并分配給它dumtwo?
4 回答

蠱毒傳說
TA貢獻(xiàn)1895條經(jīng)驗(yàn) 獲得超3個(gè)贊
在包中import org.apache.commons.lang.SerializationUtils;
有一個(gè)方法:
SerializationUtils.clone(Object);
例:
this.myObjectCloned = SerializationUtils.clone(this.object);

至尊寶的傳說
TA貢獻(xiàn)1789條經(jīng)驗(yàn) 獲得超10個(gè)贊
為什么沒有使用Reflection API的答案?
private static Object cloneObject(Object obj){ try{ Object clone = obj.getClass().newInstance(); for (Field field : obj.getClass().getDeclaredFields()) { field.setAccessible(true); field.set(clone, field.get(obj)); } return clone; }catch(Exception e){ return null; } }
這很簡單。
編輯:通過遞歸包含子對象
private static Object cloneObject(Object obj){ try{ Object clone = obj.getClass().newInstance(); 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(clone, field.get(obj)); }else{ Object childObj = field.get(obj); if(childObj == obj){ field.set(clone, clone); }else{ field.set(clone, cloneObject(field.get(obj))); } } } return clone; }catch(Exception e){ return null; } }
添加回答
舉報(bào)
0/150
提交
取消