В частности: как я могу изменить java.lang.Object.clone
, чтобы JVM не сквоила, когда байт-код называет его?Как сделать java.lang.Object.clone общедоступным?
ответ
Питера Lawrey дал идею редактирования rt.jar
. Это работает. Это также совершенно безвредно.
(измененный код доступа модификатор 0x0104
к 0x0101
в нужном месте в rt.jar/java/lang/Object.class
)
Аналогично можно построить rtplus.jar
, содержащий только измененный файл класса и использовать -Xbootclasspath/p:rtplus.jar
иметь java
использовать эту версию вместо этого. (и да, EJP, мы не можем распространять это rtplus.jar
, но его довольно легко сгенерировать программно)
Я уверен, что это не сработает. Некоторые классы в rt.jar (например, 'java.awt.font.TextLayout') переопределяют' clone() 'и защищают его. Если вы измените 'Object.clone()', чтобы быть общедоступным, такие подклассы, вероятно, не будут загружаться, потому что в соответствии с правилами языка Java подкласс не может переопределить метод с более ограничительным модификатором доступа. –
@TedHopp: Помните, этот вопрос касается JVM, а не языка Java. На JVM это работает; Я протестировал его. (обратите внимание: вы должны вызывать 'Object.clone', а не' Thread.clone', последний делает бросок 'IllegalAccessError' (ofc, вызывающий' Object.clone' имеет точно такой же эффект, что и виртуальный)) – naiad
Вы не можете изменить 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
}
}
- 1. Как сделать arraylist общедоступным
- 2. Как сделать объект общедоступным?
- 3. Как сделать приложение Docker общедоступным
- 4. Как сделать Apache Server общедоступным?
- 5. Как сделать сервер Apache общедоступным
- 6. Как сделать сервис bluetooth общедоступным?
- 7. Как сделать массив ярлыков общедоступным
- 8. Как сделать список классов общедоступным?
- 9. Как сделать код nodeJS общедоступным
- 10. Сделать репозиторий SVN общедоступным
- 11. Сделать общедоступным членский опрос
- 12. Boto S3: сделать файл общедоступным
- 13. Сделать отчет общедоступным в Odoo
- 14. Сделать QTimer общедоступным. (Qt, C++)
- 15. Где сделать исходный код общедоступным
- 16. Как сделать сервер django общедоступным в rasb?
- 17. Как сделать каталог общедоступным на Grails?
- 18. Как сделать компонент общедоступным в Angular2
- 19. Как сделать ListView общедоступным в .NET winforms?
- 20. Как сделать Openfire Server общедоступным с localhost
- 21. Как сделать массив объектов общедоступным с переменной
- 22. Как сделать общедоступным MySQLDataReader CLS-совместимым?
- 23. Как сделать мое приложение для facebook общедоступным
- 24. Как сделать приватный метод общедоступным методом
- 25. Erlang: Принудительно сделать метод общедоступным, почему?
- 26. Actionscript - Сделать компонент TextArea общедоступным и доступным
- 27. Сделать способ общедоступным для конфигурации сборки UNITTESTS
- 28. Могу ли я сделать сеанс браузера общедоступным?
- 29. WordPress Сделать Customizer общедоступным для демонстрационных целей
- 30. Безопасно сделать этот скрипт общедоступным? Новичок Вопрос
Зачем вам это нужно? Пожалуйста, объясните проблему, которую вы хотите решить. – AlexR
Как @AlexR говорит, вы, кажется, даете нам синдром, а не первопричину. Итак, когда (или как) вызывает вызов этого метода Object # clone в вашем стеке? – Riduidel
Я хочу иметь стандартный метод копирования. Поведение Клона заставляет его работать хорошо, за исключением того, что JVM сквозит из-за его защиты. Это основная причина, а не симптом. – naiad