如何在没有罐子的情况下附加代理?

问题描述

(使用Java 11)
我可以在运行时通过jar注入代理,

patch.stopall()

有没有办法附上没有的罐子?
我可以使用VirtualMachine jvm = VirtualMachine.attach(jvmPid); jvm.loadAgent("/path/to/agent.jar"); jvm.detach(); 来做到这一点,但是如何在没有byte-buddy这样的第三方库的情况下实现呢?

解决方法

您必须为此提供一个jar文件。

字节伙伴代理( byte-buddy-agent ,而不是 byte-buddy jar)包含代理清单标头本身。首次尝试时,它尝试在本地文件系统上定位自己的jar(通过getProtectionDomain().getCodeSource())。如果它不能执行此操作,或者作为非jar文件存在于文件夹中,则会创建一个具有所需属性的临时jar文件。

byte-buddy-agent 是一个最小的,零依赖的jar。我建议使用它作为附加API的名称空间在旧的IBM和HotSpot VM上有所不同,它在Java 9+上需要不同的设置,并且如果存在JNA,则Byte Buddy可以在非JDK VM上模拟附件。 (免责声明:我是作者。)