Java - 将 java 代理注入(inject)运行的 jvm

标签 java jvm classloader javaagents

基本上,我正在尝试编写一些东西来列出 JVM 加载的每个类。我写的东西有效,但它只适用于它运行的 jvm。 我制作了一个 java 代理来动态注入(inject)另一个 JVM,但后来意识到我实际上并不知道如何注入(inject)它。 我如何实际将此代理发送到另一个 JVM? 可能吗?

最佳答案

动态代理需要声明一个 agentmain(String, Instrumentation) 方法,该方法在目标 VM 内连接时执行。您可以使用仅包含在 JDK 而不是 JRE 中的 tools.jar 依赖项(直到 Java 9)。但是,您可以将代理程序与 JDK 捆绑在一起,然后从那里附加到 JVM。

最大的陷阱是 API 因不同的虚拟机而异;但是,您可以使用像 byte-buddy-agent 这样的库其中包含针对不同 VM 的不同实现。可以使用以下方式完成附件:

ByteBuddyAgent.attach("my.jar", "my-pid");

这会将 my.jar 中包含的代理附加到 ID 为 my-id 的 Java 进程。

关于Java - 将 java 代理注入(inject)运行的 jvm,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38948847/

相关文章:

java - NetworkInfo 始终返回 null

java - Eclipse 4.4(64 位 mac)需要 JVM v1.7+

java - Java 如何让低效代码运行得比高效代码更快?

java - 类初始化时如何确定类加载器?

java - 如何解决此 Weblogic 间歇性 java.lang.LinkageError?理解其含义并解决它的步骤是什么?

java - 了解Powershell中Windows机器中安装了什么Java版本

java - 带@Transactional(propagation = Propagation.SUPPORTS)的方法和不带@Transactional的方法有什么区别?

java - 解释在 Kotlin 方法上使用 @JvmOverloads 生成的 Java 代码

java - 类加载器、类差异

java - Groovy 正则表达式不起作用