2011-12-20 4 views
-1

В частности: как я могу изменить java.lang.Object.clone, чтобы JVM не сквоила, когда байт-код называет его?Как сделать java.lang.Object.clone общедоступным?

+3

Зачем вам это нужно? Пожалуйста, объясните проблему, которую вы хотите решить. – AlexR

+0

Как @AlexR говорит, вы, кажется, даете нам синдром, а не первопричину. Итак, когда (или как) вызывает вызов этого метода Object # clone в вашем стеке? – Riduidel

+0

Я хочу иметь стандартный метод копирования. Поведение Клона заставляет его работать хорошо, за исключением того, что JVM сквозит из-за его защиты. Это основная причина, а не симптом. – naiad

ответ

1

Питера Lawrey дал идею редактирования rt.jar. Это работает. Это также совершенно безвредно.

(измененный код доступа модификатор 0x0104 к 0x0101 в нужном месте в rt.jar/java/lang/Object.class)

Аналогично можно построить rtplus.jar, содержащий только измененный файл класса и использовать -Xbootclasspath/p:rtplus.jar иметь java использовать эту версию вместо этого. (и да, EJP, мы не можем распространять это rtplus.jar, но его довольно легко сгенерировать программно)

+0

Я уверен, что это не сработает. Некоторые классы в rt.jar (например, 'java.awt.font.TextLayout') переопределяют' clone() 'и защищают его. Если вы измените 'Object.clone()', чтобы быть общедоступным, такие подклассы, вероятно, не будут загружаться, потому что в соответствии с правилами языка Java подкласс не может переопределить метод с более ограничительным модификатором доступа. –

+1

@TedHopp: Помните, этот вопрос касается JVM, а не языка Java. На JVM это работает; Я протестировал его. (обратите внимание: вы должны вызывать 'Object.clone', а не' Thread.clone', последний делает бросок 'IllegalAccessError' (ofc, вызывающий' Object.clone' имеет точно такой же эффект, что и виртуальный)) – naiad

4

Вы не можете изменить java.lang.Object.clone(). Вы можете переопределить clone(), чтобы сделать его общедоступным методом в любом классе, который вы определяете, хотя это довольно бесполезно, если только класс (или некоторый класс в его иерархии) не объявлен для реализации интерфейса Cloneable.

public class MyClass implements Cloneable { 
    public Object clone() { 
     return super.clone(); 
    } 
} 

Другой обычный подход к копированию, чтобы определить конструктор копирования: комментарий

public class MyClass { 
    public MyClass() { 
     // standard default constructor 
    } 

    public MyClass(MyClass other) { 
     // copy constructor -- initialize from values in other 
    } 
} 
+0

-1: Этот ответ не пригодится. – naiad

+2

Этот ответ * * * полезно. Он точно объясняет, как работать с 'clone()' – AlexR

+0

@AlexR: я не спрашивал, как работать с clone() в обычном java-языке. Этот ответ отвечает на другой вопрос, чем тот, который я спросил: это не полезно. – naiad

Смежные вопросы