Как манипулировать байт-кодом класса непосредственно перед его загрузкой? - PullRequest
2 голосов
/ 29 июня 2019

Я пытаюсь найти способ манипулировать байт-кодом класса (во время выполнения) непосредственно перед его загрузкой.Мне нужно сделать это, потому что манипулирование зависит от того, чего нет до main (и, возможно, до загрузки предметного класса).

Я уже смотрел на java-агенты.Метод premain здесь явно не применим, потому что он выполняется до main, что означает, что он не может зависеть от того, что установлено в main.Другой вариант: agentmain и - загрузка агента вручную во время выполнения .Теперь проблема в том, что в более новых версиях (9+) зависимости, необходимые для этого (tools.jar), похоже, больше не присутствуют.

Теперь я хотел бы знатьЧто было бы лучшим способом манипулировать байт-кодом в определенный момент времени выполнения или непосредственно перед загрузкой класса, и если это все еще возможно как-то с Java 9+.

1 Ответ

1 голос
/ 29 июня 2019

Метод premain здесь явно не применим, потому что он выполняется до main, что означает, что он не может зависеть от чего-то, что установлено в main

Это не правда.Агенту не нужно изменять байт-код класса прямо во время загрузки агента.Он может просто зарегистрировать ClassFileTransformer и отложить манипулирование байт-кодом, пока целевой класс не будет загружен позже.В качестве альтернативы агент может просто сохранить экземпляр Instrumentation для последующего использования в любой удобный момент времени.

в более новых версиях (9+), зависимости, необходимые для этого (tools.jar), похоже, больше не присутствуют

Это также несовершенно правильно.Attach API существует во всех новых версиях JDK.Поскольку JDK 9 больше не требует tools.jar, вместо этого он принадлежит модулю jdk.attach.

Для облегчения присоединения во время выполнения вы можете использовать byte-buddy-agent илиавтономная утилита jattach.Оба работают с JDK 8-, а также с JDK 9 +.

...