在程序启动后启动 Java 代理程序

2022-09-01 17:20:12

是否可以在虚拟机从同一 VM 中启动后插入 javaagent?

例如,假设我们在 jar myagent 中有一个代理.jar具有适当的元数据设置和已实现的 agentmain 方法。现在,用户程序调用 API 调用,这将导致插入代理,以便它可以重新定义类。

它能做到吗,如何做到?


答案 1

答案 2

是的,您只需要将 JVM 进程 ID 传递给方法,然后加载代理 jar。该类在 JDK_HOME/lib/tools.jar 文件中可用。以下是如何在运行时激活代理的示例:VirtualMachine.attach(String pid)VirtualMachine

public static void attachGivenAgentToThisVM(String pathToAgentJar) {
  try {                                                                               
    String nameOfRunningVM = ManagementFactory.getRuntimeMXBean().getName();                                                   
    String pid = nameOfRunningVM.substring(0, nameOfRunningVM.indexOf('@'));                                                   
    VirtualMachine vm = VirtualMachine.attach(pid);                                                                            
    vm.loadAgent(pathToAgentJar, "");
    vm.detach();   
  } catch (Exception e) {
    e.printStackTrace();
  }
}                                                                                                            

推荐