#java #class #classloader
#java #класс #загрузчик классов
Вопрос:
Я заинтересован в исправлении основных классов Java. Такие вещи, как типы данных as String
, Graphics
(Swing) и классы from lib/rt.jar
в целом.
Итак, на мой взгляд, для этого есть несколько методов:
- создайте пользовательские классы и включите их в JVM, затем запустите jvm с
-Xbootclasspath
- напишите новый загрузчик начальной загрузки, который будет использовать Java-код для пользовательских классов
- используйте байт-код агентов и инструментов при загрузке (не слишком хорошо знаком с этим)
Я хотел бы услышать ваши советы / мнения относительно методов, может быть, я что-то упускаю?
Комментарии:
1. Совет: не делайте этого. Вы почти наверняка пожалеете об этом.
2. иногда «человек должен делать то, что должен делать человек» 😉
Ответ №1:
Изменение таких классов с использованием пути к загрузочному классу может нарушать ваше лицензионное соглашение. (Если это вас беспокоит) Изменение байтового кода, по-видимому, разрешено.
Другой способ изменить системные классы — добавить jars в jre/lib/endorsed
каталог (который вы должны создать) Он загрузит здесь все, что предпочтительнее других jar.
Изменение класса String может привести к путанице в -XX:UseCompressedStrings
выборе. Возможно, вы захотите проверить, что происходит с любыми изменениями.
Я сделал это при тестировании, чтобы получить дополнительный анализ от системы. Я не пробовал изменять эти классы для производственного использования.
Я подозреваю, что все, что вы пытаетесь сделать, может быть сделано другим способом, но без более подробной информации это невозможно сказать.
Комментарии:
1. спасибо, что упомянул о проблеме с лицензией, Питер, я не знал об этом. Короче говоря, я хотел бы иметь возможность вводить / использовать пользовательский код в ЛЮБОЙ загружаемый класс Java с целью мониторинга, профилирования и тому подобного. Я знаю о доступных профилировщиках, но я хотел бы иметь некоторое «поведенческое» профилирование (интересно, имеет ли это предложение какой-либо смысл)
2. Возможно, AOP — самый простой подход. Это делает инъекцию байтового кода для вас. Это позволяет вам вводить код при вводе / выходе методов. например, для регистрации таких событий.
3. Хорошо, звучит неплохо. Я посмотрю на это, если у вас есть какое-либо рекомендуемое место, с которого я могу начать (вместо глубокого погружения в AOP), это было бы здорово! Но могу ли я добиться такого поведения с помощью агентов ?
4. Вы можете, но манипулирование байтовым кодом — сложное дело. Используя AOP, вы можете написать что-то похожее на Java. AOP может предоставить агент для внедрения байтового кода во время выполнения. Вот некоторые фреймворки java-sources.net/open-source/aspect-oriented-frameworks
Ответ №2:
Другой вариант — загрузить / проверить исходный код OpenJDK и создать его для себя с учетом ваших изменений.
Но не называйте это Java. То, что вы делаете, скорее всего, приведет к тому, что он будет несовместим с реальной вещью.
иногда «человек должен делать то, что должен делать человек» 😉
Цитирование Джона Уэйна не делает то, что вы предлагаете, мудрым шагом.
нет, нет, нет. Я хочу, чтобы он был совместим с HotSpot.
Совместимости с HotSpot недостаточно. Существуют строгие правила, регулирующие использование товарного знака Java в реализации «java». Вам разрешено вызывать вашу реализацию Java только в том случае, если она прошла тесты Java STK.
И «Я хочу, чтобы он был совместим» означает нечто отличное от «совместим», и это игнорирует вопрос о том, что вы подразумеваете под совместимостью.
Комментарии:
1. нет, нет, нет. Я хочу, чтобы он был совместим с HotSpot, поэтому спрашивал об агентах. если у вас есть какие-либо конструктивные предложения, которые могут соответствовать моим потребностям, я был бы более чем рад это услышать.
2. @PavelK — если вы хотите правильно прочитать мой ответ, вы увидите, что это конструктивный ответ. Подсказка: первое предложение.