Jak mogę użyć java.lang.instrument w aplikacji Eclipse RCP?
Aby korzystać z funkcji instrumentacji wprowadzonych w JDK 5, możesz użyć-javaagent
flaga przekazana do JVM. Spowoduje to wstrzyknięcie instancji klasy Instrumentation do statycznegopremain
metoda. Na przykład w klasie takiej jak ta:
public class MyClass {
public static Instrumentation inst;
public static void premain(String options, Instrumentation inst) {
MyClass.inst = inst;
}
}
Za pomocą odpowiedniego pliku manifestu możesz go uruchomić w następujący sposób:
java -javaagent:myfiles.jar SomeClass
To wywołuje wtedy metodę premainmain
zSomeClass
. To podejście jest stosowane wProjekt Java.SizeOf odgadnąć przybliżony rozmiar obiektu Java.
OK, teraz w Eclipse RCPkażdy pakiet ma swój własny program ładujący klasy. Oznacza to, że statyczna instrumentacja, którą przechowywaliśmy w MyClass, nie jest widoczna dla aplikacji Eclipse. Javaagent używa jednego programu ładującego klasy, pakiety Eclipse są ładowane innym. Kiedy uzyskamy dostępMyClass.inst
z wnętrza wtyczki jestnull
, tak jakże klasa nie jest tą samą klasą, co javaagent załadowany i wywołanypremain
na.
Inne wskazówki dotyczące możliwego rozwiązania toten wątek na liście dyskusyjnej rcp. Ale nic rozstrzygającego.
Czy jest jakiś sposób na obejście tego? TheEclipse-BuddyPolicy
podpowiedzi w artykule eclipsezone brzmią dobrze. Próbowałem:
Eclipse-BuddyPolicy: app
w moich wtyczkach bez szczęścia. Potrzebuję czegoś takiegoEclipse-BuddyPolicy: javaagent
. Jakieś pomysły?