(使用Java 11)
我可以在运行时用 jar 注入代理,通过:
VirtualMachine jvm = VirtualMachine.attach(jvmPid);
jvm.loadAgent("/path/to/agent.jar");
jvm.detach();
有什么方法可以在不使用罐子的情况下固定?
我可以使用 byte-buddy
做到这一点,但是如果没有像
byte-buddy
这样的第三方库怎么办?
Byte Buddy 代理(
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 上模拟附件。 (免责声明:我是作者。)