Как сделать java.lang.Object.clone общедоступным? - PullRequest
0 голосов
/ 20 декабря 2011

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

Ответы [ 2 ]

4 голосов
/ 20 декабря 2011

Вы не можете изменить 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
    }
}
2 голосов
/ 20 декабря 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...