首页 > 解决方案 > 为什么/如果实例未实现 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()抛出的原因。准确地说,哪行代码抛出?我错过了一些愚蠢的东西?CloneNotSupportedExceptionCloneableCloneNotSupportedException

标签: java

解决方案


推荐阅读