Как работает клон под капотом? - PullRequest
6 голосов
/ 26 июля 2011

Клон не вызывает конструктор объекта для создания копии объекта. Так какой алгоритм использует клон?

Я ищу детали реализации нативного метода-клона. Любые указатели будут оценены.

Обратите внимание, что я знаю о недостатках клона.

Ответы [ 4 ]

3 голосов
/ 26 июля 2011

Как это работает, изложено в Javadoc :

Метод clone для класса Object выполняет определенную операцию клонирования. Во-первых, если класс этого объекта не реализует интерфейс Cloneable, тогда генерируется CloneNotSupportedException. Обратите внимание, что все массивы считаются для реализации интерфейса Cloneable. В противном случае этот метод создает новый экземпляр класса этого объекта и инициализирует все его поля точно содержимым соответствующих полей этого объекта, как если бы он был назначен; содержимое полей не клонируется. Таким образом, этот метод выполняет «мелкую копию» этого объекта, а не «глубокую копию».

Например, наивная, мелкая полевая копия, очень почти (но, вероятно, не совсем) просто побитовая копия объекта.

Я ищу подробности реализации нативного метода-клона.

Это будет варьироваться от реализации JVM до реализации JVM. Однако, вероятно, это будет довольно эффективная операция, если вас это беспокоит.

3 голосов
/ 26 июля 2011

protected native Object clone(). Я точно не знаю (мне нужно взглянуть на нативный код), но он создает новый экземпляр объекта внутри JVM и копирует все поля.

Но вы должны избегать использования clone() - это трудно понять правильно. Посмотрите на этот вопрос для более подробной информации

1 голос
/ 26 июля 2011

С точки зрения JNI, clone реализуется (или может быть) реализован с использованием метода AllocObject, который создает новый объект без вызова какого-либо конструктора (в отличие от NewObject).Когда у вас есть новый объект, отражение используется для поверхностного копирования всех полей.

Но опять же, механизм clone / Clonable в Java в корне нарушен.У Джошуа Блоха есть раздел об этом Эффективная Java .Есть также несколько связанных SO вопросов об этом.

0 голосов
/ 26 июля 2011

Реализация Object.clone() является нативным методом, который проверяет, что класс объекта реализует Cloneable, а затем просто выделяет новый экземпляр и выполняет полевую копию по полю.Скорее всего, копирование выполняется с использованием копии из памяти - нет необходимости делать что-то более причудливое.(Но если вы действительно хотите знать, посмотрите на исходный код OpenJDK.)

...