[Java]对对象深度拷贝的问题

问题描述

我现在有如下这几个对象:class A { private Long id; private List<B> listB; private D d; ......}class B { private Long id; private A a; private List<C> listC; ......}class C { private Long id; private B b; ......}class D { private Long id; private A a; ......}现在我希望将A对象进行深拷贝,将A对象下的所有属性都做一个副本出来,但是ID不要复制。 我现在的想法是: 1.将每个对象clone出来一个副本,然后将id栏位置空。 2.或者对每个对象做一个构造函数,如:public A (A a){ this.xxx = a.xxx; ......}然后将每个对象通过构造函数来构一个新的对象出来,除了ID栏位。  但是这样做就需要写大篇的代码,请问大家有没有什么比较简单的方法来实现这个功能?

解决方案

序列化,反序列化,清空id
解决方案二:
推荐的方法是:做一个顶层类,ABCD都从顶层类集成,这样你只需要写一个clone()就可以了。在这个clone里:1:名字为ID的属性跳过;2:instanceof判断是否是顶层类的对象,如果是调用clone()进行拷贝;3:简单类型直接通过反射赋值;
解决方案三:
你需要一个apache的工具类,commons-beanutils.jar org.apache.commons.beanutils.BeanUtils.copyProperties(B,A);B.setId(null);
解决方案四:
反射做啊,动态取得你的类的属性,进行复制,碰到list之类的就判断类型之后循环copy。可以使用apache的BeanUtil之类的东西帮你做。自己写的话,如果你知道你用到了哪些类型的数据,可以只针对这些数据做反射。所有类型都考虑的话还是挺累的,特别是和格式转换相关的部分(比如一个是string另一个是Date,但是名字相等的情况)

时间: 2024-10-27 07:04:15

[Java]对对象深度拷贝的问题的相关文章

Java利用序列化实现对象深度clone的方法_java

本文实例讲述了Java利用序列化实现对象深度clone的方法.分享给大家供大家参考.具体实现方法如下: ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(byteOut); out.writeObject(obj); ByteArrayInputStream byteIn = new ByteArrayInputStream(by

java中对象的浅复制和深复制笔记

在面向对象的语言中,如Java/Python,对象的复制有两种形式:浅复制和深复制 一.浅复制    浅复制只是将原对象的引用备份了一份给新的变量,实际两者指向的是同一个对象.在Python中,字典.列表.元祖等都是对象类型 >>> person=['name',['savings',100.00]] >>> hubby=person[:] >>> wifely=list(person) >>> [id(x) for x in per

java克隆对象

若需修改一个对象,同时不想改变调用者的对象,就要制作该对象的一个本地副本.这也是本地副本最常见的一种用途.若决定制作一个本地副本,只需简单地使用clone()方法即可.Clone是"克隆"的意思,即制作完全一模一样的副本.这个方法在基础类Object中定义成"protected"(受保护)模式.但在希望克隆的任何衍生类中,必须将其覆盖为"public"模式.例如,标准库类Vector覆盖了clone(),所以能为Vector调用clone(),如

Java中对象的深复制和浅复制详解

1.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象. ⑵深复制(深克隆) 被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量.那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象.换言之,深复制把要复制的对象所引用的对象都复制了一遍. 2.Java的clone()方法 ⑴clone方法将对象复制了一份并返回

拷贝构造,深度拷贝,关于delete和default相关的操作,explicit,类赋初值,构造函数和析构函数,成员函数和内联函数,关于内存存储,默认参数,静态函数和普通函数,const函数,友元

 1.拷贝构造 //拷贝构造的规则,有两种方式实现初始化. //1.一个是通过在后面:a(x),b(y)的方式实现初始化. //2.第二种初始化的方式是直接在构造方法里面实现初始化. 案例如下: #include<iostream> //如果声明已经定义,边不会生成 class classA { private: int a; int b; public: //拷贝构造的规则,有两种方式实现初始化 //1.一个是通过在后面:a(x),b(y)的方式实现初始化 //2.第二种初始化的方式是直

Java中对象的深复制(深克隆)和浅复制(浅克隆)介绍_java

1.浅复制与深复制概念 ⑴浅复制(浅克隆)      被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象. ⑵深复制(深克隆)      被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量.那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象.换言之,深复制把要复制的对象所引用的对象都复制了一遍. 2.Java的clone()方法 ⑴clone方法将

javascript克隆对象深度介绍_基础知识

js一般有两种不同数据类型的值: 基本类型(包括undefined,Null,boolean,String,Number),按值传递: 引用类型(包括数组,对象),按址传递,引用类型在值传递的时候是内存中的地址. 克隆或者拷贝分为2种: 浅度克隆:基本类型为值传递,对象仍为引用传递. 深度克隆:所有元素或属性均完全克隆,并于原引用类型完全独立,即,在后面修改对象的属性的时候,原对象不会被修改. 复制代码 代码如下: function cloneObject(obj){ var o = obj.c

求大神解答一下-java中对象流objectstream问题

问题描述 java中对象流objectstream问题 输出的为什么不是cyh男20 ym女20求大神解答!!!!!!!!!! 解决方案 你的代码和我这个一样吗?麻烦把你的代码粘全了,我看看 解决方案二: 这个是照片......... 解决方案三: 我和你写的差不多,不知道你为啥会这样,我给你粘出我的代码package lianxi; import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOE

Java的“对象思想”学习笔记[二]

笔记|对象 在这篇文章里我将介绍一些Java对于对象的基本处理模式的问题. 首先看一个有关对象相等性(Object equivalence)的例子: 先看下面的代码: public class EqualTest1{ public static void main(String[] args){ Integer n1 = new Integer(20); Integer n2 = new Integer(20); System.out.println(n1 = = n2); System.out