Iniciar un agente Java después del inicio del programa
javaagents (3)
Debería poder hacerlo en Java 6, consulte el capítulo de documentación del paquete "Agentes de inicio después del inicio de VM"
Edición: Tal vez ya era posible en Java 5 y solo los javadocs no lo mencionaron explícitamente.
¿Es posible insertar un javaagent después de que la máquina virtual comience desde la misma máquina virtual?
Digamos, por ejemplo, que tenemos un agente en un jar myagent.jar con la configuración de metadatos adecuada y un método agentmain ya implementado. Ahora el programa de los usuarios llama a una llamada a la API que debería resultar en la inserción del agente para que pueda redefinir las clases.
¿Se puede hacer y cómo?
https://web.archive.org/web/20141014195801/http://dhruba.name/2010/02/07/creation-dynamic-loading-and-instrumentation-with-javaagents/ tiene un gran ejemplo de cómo escribir un agente, así como cómo iniciar uno sobre la marcha.
Sí, solo tiene que pasar la ID del proceso JVM al método VirtualMachine.attach(String pid)
y cargar el jar del agente. La clase VirtualMachine está disponible en el archivo JDK_HOME / lib / tools.jar. Aquí hay un ejemplo de cómo activo un agente en tiempo de ejecución:
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();
}
}