Пользовательский класс ядра Java

#java #class #classloader

#java #класс #загрузчик классов

Вопрос:

Я заинтересован в исправлении основных классов Java. Такие вещи, как типы данных as String , Graphics (Swing) и классы from lib/rt.jar в целом.

Итак, на мой взгляд, для этого есть несколько методов:

  1. создайте пользовательские классы и включите их в JVM, затем запустите jvm с -Xbootclasspath
  2. напишите новый загрузчик начальной загрузки, который будет использовать Java-код для пользовательских классов
  3. используйте байт-код агентов и инструментов при загрузке (не слишком хорошо знаком с этим)

Я хотел бы услышать ваши советы / мнения относительно методов, может быть, я что-то упускаю?

Комментарии:

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 — если вы хотите правильно прочитать мой ответ, вы увидите, что это конструктивный ответ. Подсказка: первое предложение.