Для использования функций инструментария, представленных в JDK 5, можно использовать -javaagent
флаг передал JVM. Это введет экземпляр класса Инструментария в помехи premain
метод. Например, в классе как это:
public class MyClass {
public static Instrumentation inst;
public static void premain(String options, Instrumentation inst) {
MyClass.inst = inst;
}
}
С соответствующим файлом манифеста можно выполнить это следующим образом:
java -javaagent:myfiles.jar SomeClass
Это называет предосновной метод затем main
от SomeClass
. Этот подход используется в Java. Проект SizeOf предположить приблизительный размер объекта Java.
Хорошо, теперь в Eclipse RCP каждый пакет имеет свой собственный classloader. Это означает, что статический Инструментарий, который мы сохранили в нашем MyClass, не видим к приложению Eclipse. javaagent использует один загрузчик класса, пакеты Eclipse загружаются другим. Когда мы получаем доступ MyClass.inst
из плагина это null
, поскольку тот класс не является тем же классом как тот javaagent, загруженный и названный premain
на.
Другие подсказки относительно возможного решения являются этим потоком в rcp списке рассылки. Но ничто окончательное.
Там какой-либо путь состоит в том, чтобы работать вокруг этого? Eclipse-BuddyPolicy
намекнувший в eclipsezone статье звучит хорошим. Я попробовал:
Eclipse-BuddyPolicy: app
в моих плагинах без удачи. Мне нужно что-то как Eclipse-BuddyPolicy: javaagent
. Какие-либо идеи?
Я думаю, что самое простое решение - использовать объект глобальных свойств. Pre-Maste Store приборочный объект инструментария как глобальные свойства, а затем доступа к нему везде (объект объекта свойств одинаково во всех классовых погрузчиках):
[править: Обновлено]
public class MyClass {
private static final String KEY = "my.instrumentation";
public static void premain(String options, Instrumentation inst) {
Properties props = System.getProperties();
if(props.get(KEY) == null)
props.put(KEY, inst);
}
public static Instrumentation getInstrumentation() {
return System.getProperties().get(KEY);
}
}