родной инструментарий Java-байт-кода - PullRequest
4 голосов
/ 22 января 2012

для инструментария байт-кода в java, есть инфраструктура asm и библиотеки bcel и javaassist.

Однако мне нужно выполнить инструментарий в нативном коде, поскольку некоторые java-классы уже загружены к моменту запуска javaagent, например, java.lang.Thread, java.lang.Class и т. Д.

есть ли библиотека для инструментария Java-классов в нативном коде?

Edit: Кажется, здесь есть некоторая путаница.

То, что я хочу, это: Создайте собственный Java-агент, который использует API-интерфейс JVMTI для изменения байт-кода класса во время его загрузки, используя перехват событий OnClassLoad.

Ответы [ 3 ]

7 голосов
/ 14 февраля 2012

Я столкнулся с этой проблемой во время моей докторской исследования. Лучшим ответом для меня было выполнение модификации байт-кода в отдельной JVM с использованием библиотеки Java (я использовал ASM).

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

Я обнаружил, что переплетать классы внутри той же JVM, что и при профилировании, было слишком сложно, так как файлы системных классов, которые я хотел изменить (например, java.lang.Object), должны были быть загружены до того, как все файлы классов мне понадобились выполнить ткачество. Я без особого успеха охотился за библиотеками байт-кода c / c ++, прежде чем остановиться на отдельном подходе JVM, который я наконец-то использовал.

Вы можете параметризовать агента JVMTI с помощью имени хоста / порта JVM ткача или использовать какую-либо форму обнаружения, в зависимости от ваших требований.

2 голосов
/ 22 января 2012

JIT превратит байт-код в собственный код. Если вы хотите создать собственный код, вам нужно позволить JIT сделать это или написать собственный код, который вызывается через JNI.

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

Создайте собственный Java-агент, который использует JVMTI apis для изменения байт-кода класса во время его загрузки, используя перехват событий OnClassLoad.

Хотя вам не нужно делать то, что вы хотите. Зачем делать решение более сложным (и с меньшей вероятностью работать), чем должно быть?

0 голосов
/ 22 января 2012

Вы не можете изменить байтовый код класса после его загрузки.Вы можете либо убедиться, что ваше инструментарий работает до его загрузки, либо вы можете создать новый ClassLoader и повторно загрузить классы внутри него, не запрашивая родительский класс.Вы не можете использовать эти классы с кодом, загруженным за пределы ClassLoader, поскольку этот код будет ссылаться на ранее загруженный, неизмененный класс.

...