Ответ 1
https://web.archive.org/web/20141014195801/http://dhruba.name/2010/02/07/creation-dynamic-loading-and-instrumentation-with-javaagents/ имеет отличный пример того, как писать агента, а также как запускать его на лету.
Можно ли вставить javaagent после запуска виртуальной машины внутри одной VM?
Предположим, например, что у нас есть агент в банке myagent.jar с соответствующей настройкой метаданных и уже реализован метод agentmain. Теперь пользовательская программа вызывает вызов API, который должен привести к вставке агента, чтобы он мог переопределять классы.
Можно ли это сделать и как?
https://web.archive.org/web/20141014195801/http://dhruba.name/2010/02/07/creation-dynamic-loading-and-instrumentation-with-javaagents/ имеет отличный пример того, как писать агента, а также как запускать его на лету.
Да, вам просто нужно передать идентификатор процесса 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();
}
}
Вы должны иметь возможность сделать это на Java 6, см. документация по пакетам в главе "Запуск агентов после запуска VM"
edit: Возможно, это было возможно в Java 5 уже, и только javadocs не упомянули, что явно