2009-08-14 17 views
22

Czy jest możliwe wstawienie obiektu javaagent po uruchomieniu maszyny wirtualnej z tej samej maszyny wirtualnej?Uruchamianie agenta Java po uruchomieniu programu

Powiedzmy, że mamy na przykład agenta w pliku jar myagent.jar z odpowiednią konfiguracją meta-danych i metodą agenta agenta już zaimplementowaną. Teraz program użytkownika wywołuje wywołanie API, które powinno spowodować wstawienie agenta, aby mógł ponownie zdefiniować klasy.

Czy można to zrobić i jak?

Odpowiedz

4

Powinieneś być w stanie to zrobić w Javie 6, patrz package documentation rozdziale „Uruchom Agents VM Po uruchomieniu”

EDIT: Może to było możliwe w Javie 5 i już tylko Javadocs nie wspomnieć o tym, że jawnie

+0

Nie określa jednak, jakie jest to wywołanie metody. Patrząc dalej to jednak ((URLClassLoader) ClassLoader.getSystemClassLoader()). AddURL (....) gdzie dodany adres URL wskazywał na wynik myagent.jar w wywołaniu nazwy agenta? –

+0

Czy to jest Java 6 ogólnie, czy tylko z HotSpotem? –

+0

@Paul: Nie próbowałem tego, więc nie mogę powiedzieć, czy to działa, ale wydaje się rozsądne. Jednak będziesz musiał wywołać addURL poprzez odbicie, ponieważ jest on chroniony. Coś takiego: Sysloader URLClassLoader = (URLClassLoader) ClassLoader.getSystemClassLoader(); \t Class sysclass = URLClassLoader.class; \t try { \t \t Metoda metody = sysclass.getDeclaredMethod ("addURL", parametry); \t method.setAccessible (true); \t \t method.invoke (sysloader, new Object [] {yourURL}); \t} – HerdplattenToni

18
+3

Powiązany przykład jest niekompletny i nie działa. –

+3

To nie jest samodzielny samouczek, prawda. Jest to jednak świetny przykład dla zaawansowanych programistów Java. Osobiście nie miałem problemu z tym przykładem. –

+1

Link jest uszkodzony. Udało mi się go zarchiwizować na WayBackMachine: https://web.archive.org/web/20141014195801/http://dhruba.name/2010/02/07/creation-dynamic-loading-and-instrumentation-with -javaagents/ – 11101101b

12

Tak, wystarczy przekazać identyfikator procesu JVM do metody VirtualMachine.attach(String pid) i załadować słoiczek agenta. Klasa VirtualMachine jest dostępna w pliku JDK_HOME/lib/tools.jar. Oto przykład aktywacji agenta w czasie wykonywania:

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(); 
    } 
}                            
+0

dzięki za dobrą odpowiedź. ale gdy próbuję to samo, ale mam wyjątek ** com.sun.tools.attach.AgentLoadException: Agent JAR nie znaleziono lub nie ma atrybutu klasy agent ** – madhu

+1

Podejrzewam, że jest to problem zależności, tutaj, jak rozwiązać w maven : http://m.blog.csdn.net/blog/chendeng8899/8487336 (sekcja "Dynamiczne ładowanie sekcji javaagent w środowisku wykonawczym") – pierpytom

Powiązane problemy