为了账号安全,请及时绑定邮箱和手机立即绑定

如何在Java中复制对象?

如何在Java中复制对象?

狐的传说 2019-05-29 17:39:12
如何在Java中复制对象?请考虑以下代码: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'所以,我想复制dum到dumtwo并更改dum而不影响dumtwo。但上面的代码并没有这样做。当我改变某些内容时dum,也会发生同样的变化dumtwo。我想,当我说dumtwo = dum,Java 只复制引用。那么,有没有办法创建一个新的副本dum并分配给它dumtwo?
查看完整描述

4 回答

?
蛊毒传说

TA贡献1895条经验 获得超3个赞

在包中import org.apache.commons.lang.SerializationUtils;有一个方法:

SerializationUtils.clone(Object);

例:

this.myObjectCloned = SerializationUtils.clone(this.object);


查看完整回答
反对 回复 2019-05-29
?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

为什么没有使用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;
        }
    }


查看完整回答
反对 回复 2019-05-29
  • 4 回答
  • 0 关注
  • 2190 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号