Как прикрепить средство без баночки?

#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.