#java #jar #jvm #agent #byte-buddy
#java — язык #банка #спм #агент #byte-buddy #java #jar #jvm #байт-приятель
Вопрос:
(С использованием Java 11)
Я мог бы внедрить агент во время выполнения с помощью jar, через:
VirtualMachine jvm = VirtualMachine.attach(jvmPid);
jvm.loadAgent("/path/to/agent.jar");
jvm.detach();
Есть ли какой — нибудь способ прикрепить без банки?
Я могу сделать это с помощью byte-buddy
, но как это сделать без сторонних библиотек, таких как byte-buddy
?
Комментарии:
1. Могу я спросить, почему вы хотите это сделать? Это немного похоже на проблему X-Y. В принципе, вы могли бы сделать то, что byte-buddy делает самостоятельно, что, по сути, заключается в определении классов из массива байтов.
sun.misc.Unsafe.defineClass
можно определять классы из массивов байтов, хотя доступ кsun.misc.Unsafe
методам типов в java 11 немного затруднен.2. @PiRocks В code challange нужно делать подобные вещи, я могу сделать это с помощью jar, созданного вручную, но в challange нужно делать это без jar.
3. Java Agent — это JAR-файл по определению . Неясно, что вы хотите «прикрепить» без файла JAR.
Ответ №1:
Для этого у вас должен быть jar-файл.
Агент Byte Buddy (byte-buddy-agent, а не byte-buddy jar) содержит сам заголовок манифеста агента. При первой попытке он пытается найти свой собственный jar в локальной файловой системе (через getProtectionDomain().getCodeSource()
). Если он не может этого сделать или существует в папке в виде файла, отличного от jar, он создает временный файл jar с требуемыми свойствами.
byte-buddy-agent — это минимальный jar с нулевой зависимостью. Я бы рекомендовал использовать его, поскольку пространства имен для attach API отличаются на старых виртуальных машинах IBM и HotSpot, для этого требуются разные настройки на Java 9 , и поскольку Byte Buddy может эмулировать вложение на виртуальных машинах, отличных от JDK, если присутствует JNA. (Отказ от ответственности: я автор.)
Комментарии:
1. Конечно, они могли бы использовать полностью собственный агент, для которого не требовался бы jar?
2. тогда для этого требуется файл so.