Java 克隆人是如何工作的?
克隆不会调用对象构造函数来创建对象的副本。那么克隆使用什么算法呢 我正在寻找本机方法克隆的实现细节。任何指点都将不胜感激Java 克隆人是如何工作的?,java,clone,Java,Clone,克隆不会调用对象构造函数来创建对象的副本。那么克隆使用什么算法呢 我正在寻找本机方法克隆的实现细节。任何指点都将不胜感激 请注意,我知道克隆的缺点。受保护的本机对象克隆()。我不太清楚(我需要看一下本机代码),但它在JVM中创建了一个新的对象实例,并复制了所有字段 但是您应该避免使用clone()——这很难做到正确。有关更多详细信息,请参见它的工作原理如所示: classObject的方法clone执行特定的克隆操作。首先,如果该对象的类没有实现接口Cloneable,则抛出CloneNotSu
请注意,我知道克隆的缺点。
受保护的本机对象克隆()
。我不太清楚(我需要看一下本机代码),但它在JVM中创建了一个新的对象实例,并复制了所有字段
但是您应该避免使用
clone()
——这很难做到正确。有关更多详细信息,请参见它的工作原理如所示:
classObject
的方法clone
执行特定的克隆操作。首先,如果该对象的类没有实现接口Cloneable
,则抛出CloneNotSupportedException
。请注意,所有阵列都被视为实现可克隆接口。否则,此方法将创建此对象类的新实例,并使用此对象对应字段的内容初始化其所有字段,就像通过赋值一样;字段的内容本身不是克隆的。因此,此方法执行此对象的“浅拷贝”,而不是“深拷贝”操作
例如,一个简单、浅的逐场拷贝,非常接近(但可能不是完全)对象的逐位拷贝
我正在寻找本机方法克隆的实现细节
这将因JVM实现而异。不过,如果您担心的话,这可能是一个非常有效的操作。对象.clone()实现是一个本机方法,它检查对象的类是否实现了
Cloneable
,然后简单地分配一个新实例并逐字段进行浅拷贝。复制很可能是使用内存拷贝完成的——它不需要做任何更奇特的事情。(但如果您真的想知道,请查看OpenJDK源代码。)就JNI而言,clone
是(或可以)使用AllocObject
方法实现的,该方法在不调用任何构造函数的情况下创建新对象(与NewObject
相反)。拥有新对象时,反射将用于粗略复制所有字段
但是,在Java中,
clone
/Clonable
机制从根本上被打破了。约书亚·布洛赫在书中有一节是关于它的。还有一些与此相关的问题。hmm……我正在考虑本机实现是如何完成的。+1表示Joshua Block的链接,但它也被破坏了,就像克隆功能一样。以下是我们可以直接阅读的内容: