Чтобы использовать функции инструментария, представленные в JDK 5, вы можете использовать флаг -javaagent
, передаваемый в JVM. Это вставит экземпляр класса Instrumentation в статический метод premain
. Например, в таком классе:
public class MyClass {
public static Instrumentation inst;
public static void premain(String options, Instrumentation inst) {
MyClass.inst = inst;
}
}
С соответствующим файлом манифеста вы можете запустить его следующим образом:
java -javaagent:myfiles.jar SomeClass
Это вызывает метод premain, затем main
из SomeClass
. Этот подход используется в Java.SizeOf Project , чтобы угадать приблизительный размер объекта Java.
ОК, теперь в Eclipse RCP каждый пакет имеет свой собственный загрузчик классов . Это означает, что статический инструментарий, который мы сохранили в нашем MyClass, невидим для приложения Eclipse. Javaagent использует один загрузчик классов, а пакеты Eclipse загружаются с другим. Когда мы получаем доступ к MyClass.inst
из плагина, это null
, поскольку означает, что класс не совпадает с классом, загруженным javaagent и называемым premain
on.
Другие подсказки относительно возможного решения: эта тема в списке рассылки rcp. Но ничего неопровержимого.
Есть ли способ обойти это? Звучит Eclipse-BuddyPolicy
в статье о eclipsezone, звучит хорошо. Я попробовал:
Eclipse-BuddyPolicy: app
в моих плагинах без везения. Мне нужно что-то вроде Eclipse-BuddyPolicy: javaagent
. Есть идеи?