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?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage