Como o clone funciona sob o capô?

Clonar não chama o construtor de object para criar uma cópia do object. Então, qual algoritmo clone usa?

Eu estou procurando detalhes de implementação do clone do método nativo. Quaisquer pointers serão apreciados.

Note que estou ciente das deficiências do clone.

protected native Object clone() . Eu não sei exatamente (preciso dar uma olhada no código nativo), mas ele cria uma nova instância do object dentro da JVM e copia todos os campos.

Mas você deve evitar usar clone() – é difícil acertar. Olhe para esta pergunta para mais detalhes

Como funciona é colocado no Javadoc :

O método clone da class Object executa uma operação de clonagem específica. Primeiro, se a class desse object não implementar a interface Cloneable , então um CloneNotSupportedException será lançado. Observe que todos os arrays são considerados para implementar a interface Cloneable. Caso contrário, esse método cria uma nova instância da class desse object e inicializa todos os seus campos com exatamente o conteúdo dos campos correspondentes desse object, como se fosse por atribuição; o conteúdo dos campos não é clonado. Portanto, esse método executa uma “cópia superficial” desse object, não uma operação de “cópia profunda”.

Por exemplo, uma cópia superficial, campo por campo, quase (mas provavelmente não é bem assim) apenas uma cópia bit-a-bit do object.

Eu estou procurando detalhes de implementação do clone do método nativo.

Isso vai variar da implementação da JVM à implementação da JVM. É provável que seja uma operação bastante eficiente, se for essa a sua preocupação.

Em termos de JNI, o clone é (ou poderia ser) implementado usando o método AllocObject , que cria um novo object sem invocar nenhum construtor (em oposição a NewObject ). Quando você tem o novo object, a reflection é usada para copiar superficialmente todos os campos.

Mas, novamente, o mecanismo clone / Clonable é fundamentalmente quebrado em Java. Joshua Bloch tem uma seção sobre isso em Java eficaz . Há também várias perguntas relacionadas ao SO sobre isso.

A implementação Cloneable Object.clone() é um método nativo que verifica se a class do object implementa Cloneable e, em seguida, simplesmente aloca uma nova instância e faz uma cópia superficial campo a campo. A cópia é provavelmente feita usando uma cópia da memory – não há necessidade de fazer algo mais extravagante. (Mas se você realmente quiser saber, veja o código fonte do OpenJDK.)