【问题标题】:Deep Copy an Object深度复制对象
【发布时间】:2012-10-20 07:07:33
【问题描述】:

是否可以深拷贝开箱即用的Object?即除了手动编写 clone 函数之外的任何其他方式。

【问题讨论】:

  • 谢谢。这个库正在解决问题。但我不是在寻找一个库。我正在寻找逻辑。例如这个库是如何做到的?
  • 没错。但我检查了代码。它包含很少的评论。虽然可以研究代码,但有人可能会更快更好地描述逻辑。顺便说一句,我将继续研究代码作为最后的选择。谢谢。
  • 这是一个 SO thread 建议 - 序列化/反序列化。

标签: java object copy


【解决方案1】:
  1. 克隆不一定执行深层复制。事实上,Object.clone() 的默认实现会创建一个 shallow 副本。

  2. 如果对象的闭包由实现SerializableExternalizable 的对象组成,则可以使用ObjectOutputStreamObjectInputStream 来创建深拷贝……但代价高昂。

  3. cloning 库是另一种选择,但我最初阅读的代码是它依赖于图中每个对象的类,提供无参数构造函数。然后它将修补生成的对象以获得原始对象状态的副本。此过程可能会产生不良副作用,具体取决于无参数构造函数的实际作用。

简而言之,我认为没有通用解决方案。

【讨论】:

  • 不可能有真正的通用解决方案,因为它需要克隆打开的文件和网络连接、运行线程(包括等待)等等。
  • @hyde - 是的,但即使包括理论上不可能复制的类型,仍然有一组可以复制但不能复制的类型。
【解决方案2】:

我建议使用 java.lang.reflect。

java.lang.Class 公开所有字段并允许读取公共字段和调用公共方法。

只有没有访问器的私有字段不能被克隆。

【讨论】:

    【解决方案3】:

    我简要查看了cloning 库代码。它执行序列化的工作,即获取内部对象的图形,而不是写入文件,而是写入内存位置 = 这是对象的克隆。因此,尽管它比序列化更快,但它肯定在做同样的事情。

    【讨论】:

    • 不完全是。对象反序列化使用 JVM 后门创建新对象,该后门创建对象而不运行其构造函数。 (默认的Object.clone() 方法做了类似的事情......)