克隆如何在引擎盖下工作?
克隆不会调用对象构造函数来创建对象的副本。 那么克隆使用什么算法呢?
我正在寻找本机方法克隆的实现细节。 任何指针将不胜感激。
请注意,我知道克隆的缺点。
protected native Object clone()
。 我不确切知道(我需要查看本机代码)但它在JVM中创建了一个对象的新实例并复制了所有字段。
但你应该避免使用clone()
– 很难做到正确。 请查看此问题以获取更多详细信息
如何工作在Javadoc中列出:
类
Object
的方法clone
执行特定的克隆操作。 首先,如果此对象的类未实现Cloneable
接口,则抛出CloneNotSupportedException
。 请注意,所有数组都被视为实现Cloneable接口。 否则,此方法创建此对象的类的新实例,并使用该对象的相应字段的内容初始化其所有字段,就像通过赋值一样; 这些字段的内容本身不会被克隆。 因此,该方法执行该对象的“浅拷贝”,而不是“深拷贝”操作。
例如,一个天真的,浅层的逐字段拷贝,非常接近(但可能不完全)只是对象的逐位拷贝。
我正在寻找本机方法克隆的实现细节。
这将从JVM实现到JVM实现不等。 不过,这可能是一次非常有效的操作,如果这是您的担忧。
就JNI而言, clone
是(或可能)使用AllocObject
方法实现,该方法在不调用任何构造函数(而不是NewObject
)的情况下创建新对象。 拥有新对象时,reflection用于浅显示所有字段。
但Clonable
回来, clone
/ Clonable
机制在Java中从根本上被打破了。 Joshua Bloch在Effective Java中有一节介绍它。 关于它还有几个相关的SO问题 。
Object.clone()
实现是一个本机方法,它检查对象的类是否实现了Cloneable
,然后简单地分配一个新实例并进行逐个字段的浅拷贝。 复制很可能是使用内存副本完成的 – 没有必要做任何更奇特的事情。 (但如果您真的想知道,请查看OpenJDK源代码。)