【问题标题】:How does clone work under the hood?克隆如何在幕后工作?
【发布时间】:2011-10-13 03:35:16
【问题描述】:

Clone 不会调用对象构造函数来创建对象的副本。那么克隆使用什么算法呢?

我正在寻找本地方法克隆的实现细节。任何指针将不胜感激。

请注意,我知道克隆的缺点。

【问题讨论】:

    标签: java clone


    【解决方案1】:

    protected native Object clone()。我不太清楚(我需要看一下本机代码),但它会在 JVM 中创建一个对象的新实例并复制所有字段。

    但您应该避免使用clone() - 很难做到正确。查看this question了解更多详情

    【讨论】:

    • hmm...我正在考虑如何完成本机实现。
    【解决方案2】:

    它的工作原理在the Javadoc:

    Object 类的方法clone 执行特定的克隆操作。首先,如果这个对象的类没有实现接口Cloneable,那么会抛出一个CloneNotSupportedException。请注意,所有数组都被认为实现了接口 Cloneable。否则,此方法会创建此对象的类的新实例,并使用此对象的相应字段的内容来初始化其所有字段,就像通过赋值一样;字段的内容本身不会被克隆。因此,此方法执行此对象的“浅拷贝”,而不是“深拷贝”操作。

    例如,一个简单的逐个字段的浅拷贝,非常接近(但可能不完全是)对象的逐位拷贝。

    我正在寻找本地方法克隆的实现细节。

    这会因 JVM 实现而异。不过,如果您担心的话,这可能是一项非常有效的操作。

    【讨论】:

      【解决方案3】:

      就 JNI 而言,clone 是(或可能是)使用 AllocObject 方法实现的,该方法在不调用任何构造函数的情况下创建一个新对象(与 NewObject 相反)。当您拥有新对象时,反射用于浅层复制所有字段。

      不过话说回来,clone/Clonable 机制在 Java 中根本就被破坏了。 Joshua Bloch 在Effective Java 中有一个关于它的部分。还有几个相关的SO questions关于它。

      【讨论】:

      • +1 为 Joshua Block 的链接,但它也坏了,就像克隆功能一样。这是我们可以直接阅读的内容:artima.com/intv/bloch13.html
      【解决方案4】:

      Object.clone() 实现是一个本地方法,它检查对象的类是否实现了Cloneable,然后简单地分配一个新实例并逐个字段进行浅拷贝。复制很可能是使用内存副本完成的——它不需要做任何更花哨的事情。 (但如果你真的想知道,请查看 OpenJDK 源代码。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-13
        • 1970-01-01
        • 1970-01-01
        • 2013-10-28
        • 2018-08-01
        • 2018-04-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多