问题描述
(使用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上模拟附件。 (免责声明:我是作者。)