Как я могу использовать java.lang.instrument в приложении RCP Eclipse?

Для использования функций инструментария, представленных в 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. Какие-либо идеи?

5
задан richq 14 January 2010 в 11:54
поделиться

1 ответ

Я думаю, что самое простое решение - использовать объект глобальных свойств. 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);
    }
}
4
ответ дан 15 December 2019 в 01:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: