在程序启动后启动 Java 代理程序
2022-09-01 17:20:12
是否可以在虚拟机从同一 VM 中启动后插入 javaagent?
例如,假设我们在 jar myagent 中有一个代理.jar具有适当的元数据设置和已实现的 agentmain 方法。现在,用户程序调用 API 调用,这将导致插入代理,以便它可以重新定义类。
它能做到吗,如何做到?
是否可以在虚拟机从同一 VM 中启动后插入 javaagent?
例如,假设我们在 jar myagent 中有一个代理.jar具有适当的元数据设置和已实现的 agentmain 方法。现在,用户程序调用 API 调用,这将导致插入代理,以便它可以重新定义类。
它能做到吗,如何做到?
是的,您只需要将 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();
}
}