Java 对象类中的clone()实现

Java 对象类中的clone()实现,java,clone,Java,Clone,我在读一篇文章,上面写着 对象的克隆方法非常棘手。它基于字段副本,是“非语言的”。它创建一个对象而不调用构造函数” 我在表格中看到的是以下几行: protected native Object clone() throws CloneNotSupportedException; 我在这里遗漏了什么?关键字native表示实现是在本机(非Java)代码中进行的。首先,要真正理解克隆背后的概念,我建议更好地回答这个问题: 关于您在问题中输入的源代码: 本地< /C> >这里指的是,这不是用jav

我在读一篇文章,上面写着

对象
克隆
方法非常棘手。它基于字段副本,是“非语言的”。它创建一个对象而不调用构造函数”

我在表格中看到的是以下几行:

protected native Object clone() throws CloneNotSupportedException;

我在这里遗漏了什么?

关键字
native
表示实现是在本机(非Java)代码中进行的。

首先,要真正理解
克隆
背后的概念,我建议更好地回答这个问题:

关于您在问题中输入的源代码:

<代码>本地< /C> >这里指的是,这不是用java实现的方法,而是用另一种语言,通常是C或C++。它仍然是JVM的一部分,因此您可以在

中找到实际的实现。
您缺少了
native
,这意味着它是在非Java代码中实现的(在本例中,它是在JVM本身中实现的)


这是因为,
clone
的确切功能无法在Java代码中实现(这使得它非常麻烦)。

该方法被标记为
本地
,因此您无法看到它的实现,因为它不在
Java

中,为什么您说clone()的确切功能无法在Java中实现?@Subhra:正如您链接到的文章所指出的,
clone()
在不调用构造函数的情况下创建一个新对象。Java中只有两种机制允许这样做:
clone()
和序列化。这两种机制都是在本机(非Java)中实现的纯Java代码创建对象的唯一方法(没有这两种机制)是使用
new
(或等效的
Class.newInstance()
)这总是调用构造函数。+1感谢您的澄清。但是我们也可以使用反射来创建新实例,而不调用构造函数,或者我错了吗?出于好奇,如果Java的创建者没有使用
Cloneable
来决定对象是否应该支持成员式克隆(有一个本机的
Clone
方法是可调用的,但可能会引发异常),而不是简单地用一个受保护的虚拟(“本机魔法”)
CloneBase
方法定义一个“本机”类
CloneableObject
,结果框架的表达性会降低吗?因为
Object.Clone
只是(成功)可调用如果扩展
对象
的最低级别类决定实现
可克隆
,那么让这样一个类继承
可克隆对象
…似乎不会对此类的设计造成任何限制,但可以避免
克隆
的调用方捕获
未实现ted
异常。
"openjdk/hotspot/src/share/vm/prims/jvm.cpp":539

JVM_ENTRY(jobject, JVM_Clone(JNIEnv* env, jobject handle))
  JVMWrapper("JVM_Clone");
  Handle obj(THREAD, JNIHandles::resolve_non_null(handle));
  const KlassHandle klass (THREAD, obj->klass());
  JvmtiVMObjectAllocEventCollector oam;
  .
  .
  .
JVM_END