java - 为什么/如果实例未实现 Cloneable,Object.clone() 在哪里抛出 CloneNotSupportedException
问题描述
我从 java 官方文档中发现了以下语句:
在
Cloneable
[参考]
- 一个类实现 Cloneable 接口以向该
Object.clone()
方法指示该方法制作该类实例的逐个字段副本是合法的。- 在没有实现
Cloneable
接口的实例上调用 Object 的 clone 方法会导致CloneNotSupportedException
抛出异常。- 请注意,此接口不包含该
clone
方法。因此,不可能仅凭借实现该接口的事实来克隆对象。
所以,我在猜测如何Object
检查实例是否实现Cloneable
并抛出CloneNotSupportedException
. 因此,我检查了clone()
java 源代码中的实现,它包含本机声明:
protected native Object clone() throws CloneNotSupportedException;
当我检查 java_lang_Object.c 的本地实现时,我发现了这个:
JNIEXPORT jobject JNICALL Java_java_lang_Object_clone
(JNIEnv *env, jobject obj) {
struct claz *claz = FNI_CLAZ(FNI_UNWRAP_MASKED(obj));
uint32_t size = claz->size;
assert(claz->component_claz==NULL/* not an array*/);
return fni_object_cloneHelper(env, obj, size);
}
所以,如果实例没有实现,我没有找到Object.clone()
抛出的原因。准确地说,哪行代码抛出?我错过了一些愚蠢的东西?CloneNotSupportedException
Cloneable
CloneNotSupportedException