是否可以在虚拟机启动后从同一个VM中插入javaagent?
让我们说例如我们在jar myagent.jar中有一个代理,它具有适当的元数据设置和已经实现的agentmain方法.现在,用户程序调用API调用,该调用应该导致代理插入,以便它可以重新定义类.
可以这样做吗?
Ala*_*era 20
https://web.archive.org/web/20141014195801/http://dhruba.name/2010/02/07/creation-dynamic-loading-and-instrumentation-with-javaagents/有一个如何写的很好的例子代理人以及如何在飞行中启动一个代理人.
111*_*01b 14
是的,您只需将JVM进程ID传递给VirtualMachine.attach(String pid)方法,然后加载代理jar.该VirtualMachine班在JDK_HOME/lib目录/文件的tools.jar可用.以下是我在运行时如何激活代理的示例:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16353 次 |
| 最近记录: |