Подтвердить что ты не робот

Запуск Java-агента после запуска программы

Можно ли вставить javaagent после запуска виртуальной машины внутри одной VM?

Предположим, например, что у нас есть агент в банке myagent.jar с соответствующей настройкой метаданных и уже реализован метод agentmain. Теперь пользовательская программа вызывает вызов API, который должен привести к вставке агента, чтобы он мог переопределять классы.

Можно ли это сделать и как?

4b9b3361

Ответ 2

Да, вам просто нужно передать идентификатор процесса JVM методу VirtualMachine.attach(String pid) и загрузить баннер агента. Класс 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();
  }
}                                                                                                            

Ответ 3

Вы должны иметь возможность сделать это на Java 6, см. документация по пакетам в главе "Запуск агентов после запуска VM"

edit: Возможно, это было возможно в Java 5 уже, и только javadocs не упомянули, что явно