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

Pau*_*ble 25 java javaagents

是否可以在虚拟机启动后从同一个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/有一个如何写的很好的例子代理人以及如何在飞行中启动一个代理人.

  • 链接的示例不完整,不起作用. (3认同)
  • 它并不意味着是一个自包含的教程,是的.但它是高级Java开发人员的一个很好的例子.我个人对这个例子没有任何问题. (3认同)
  • 链接坏了.我能够在WayBackMachine上找到它存档:https://web.archive.org/web/20141014195801/http://dhruba.name/2010/02/07/creation-dynamic-loading-and-instrumentation-with -javaagents / (2认同)
  • 回程链接应该足够了 (2认同)

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)


Her*_*oni 4

您应该能够在 Java 6 中执行此操作,请参阅包文档章节“VM 启动后启动代理”

编辑:也许在 Java 5 中已经有可能了,只是 javadocs 没有明确提到它