3

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

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

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

Редактировать: Похоже, что есть путаница.

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

+5

Какую проблему вы должны решить? –

+0

Что вы подразумеваете под "native code"? http://www.cs.ioc.ee/~ando/jbe/ предоставляет инструмент, позволяющий напрямую редактировать байт-код java –

+0

@ ThorbjørnRavnAndersen Я хочу, чтобы классы инструментов, такие как Thread и Class, загружались до загрузки JavaAgent, таким образом они должны быть приспособлены в качестве агента. – pdeva

ответ

-1

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

+1

Я не хочу менять байт-код после его загрузки. Я хочу использовать собственный агент для изменения байтового кода *, пока * класс загружается – pdeva

1

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

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

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

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

+0

Я не хочу создавать собственный код. Я хочу изменить «байт-код» класса, когда он загружается в собственный агент, используя крюк OnClassLoad. – pdeva

+0

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

+0

«Некоторые классы Java уже загружаются к моменту запуска javaagent», например Thread, Hashmap и т. Д. – pdeva

7

Я столкнулся с этой проблемой во время моих докторских исследований. Ответ, который лучше всего работал для меня, состоял в том, чтобы выполнить модификацию байтового кода в отдельной JVM с использованием библиотеки java (я использовал ASM).

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

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

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

+3

Несколько других ответов неверно неверны или неверны. Вы можете изменить байт-код класса, который был загружен - даже системные классы. Как только класс загружен, вы не можете повлиять на его внешнюю подпись (добавить поля/методы), но вы можете изменить тела метода. Базовый JVMTI с heapTracker, распространяемый вместе с JVM, демонстрирует изменение поведения java.lang.Object. (). –

 Смежные вопросы

  • Нет связанных вопросов^_^