Wie kann ich java.lang.instrument in einer Eclipse RCP-Anwendung verwenden?
Um die in JDK 5 eingeführten Instrumentierungsfunktionen zu verwenden, können Sie die-javaagent
Flagge an die JVM übergeben. Dadurch wird eine Instanz einer Instrumentation-Klasse in das Static eingefügtpremain
Methode. Zum Beispiel in einer Klasse wie dieser:
public class MyClass {
public static Instrumentation inst;
public static void premain(String options, Instrumentation inst) {
MyClass.inst = inst;
}
}
Mit einer geeigneten Manifestdatei können Sie dies wie folgt ausführen:
java -javaagent:myfiles.jar SomeClass
Dies ruft dann die Premain-Methode aufmain
vonSomeClass
. Dieser Ansatz wird in derJava.SizeOf Project um die ungefähre Größe eines Java-Objekts zu erraten.
OK, jetzt in Eclipse RCPJedes Bundle hat einen eigenen Classloader. Dies bedeutet, dass die in MyClass gespeicherte statische Instrumentierung für eine Eclipse-Anwendung nicht sichtbar ist. Der Java-Agent verwendet einen Klassenlader, die Eclipse-Bundles werden mit einem anderen geladen. Wenn wir zugreifenMyClass.inst
Innerhalb eines Plugins ist esnull
, wieDas class ist nicht dieselbe Klasse wie die, die der Java-Agent geladen und aufgerufen hatpremain
auf.
Weitere Hinweise auf eine mögliche Lösung sinddieser Thread auf der rcp Mailingliste. Aber nichts schlüssiges.
Gibt es eine Möglichkeit, dies zu umgehen? DasEclipse-BuddyPolicy
angedeutet im Eclipsezone-Artikel hört sich gut an. Ich habe es versucht:
Eclipse-BuddyPolicy: app
in meinen Plugins ohne Glück. Ich brauche sowasEclipse-BuddyPolicy: javaagent
. Irgendwelche Ideen?