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

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

1 Ответ

4 голосов
/ 14 января 2010

Я думаю, что самое простое решение - использовать объект глобальных свойств. Предварительно сохраните объект инструментария как глобальные свойства, а затем получите доступ к нему отовсюду (объект свойств одинаков для всех загрузчиков классов):

[Редактировать: обновлено]

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);
    }
}
...