2014-09-11 4 views
1

Используя инструментарий Java, мы можем получить доступ к классу, загружаемому загрузчиком классов Java из JVM, и изменить его байт-код, вставив наш специальный код, все это выполняется во время выполнения. Нам не нужно беспокоиться о безопасности, они управляются одним и тем же контекстом безопасности, применимым для классов Java и соответствующих загрузчиков классов.Запуск приложения RCP для Eclipse с помощью инструментария Java

Мы можем получить доступ к некоторым приложениям Java, используя это при запуске в одном загрузчике классов.

Теперь мы пытаемся получить доступ к приложению RCP приложения eclipse с помощью инструментария Java, но в RCP каждый комплект имеет свой собственный загрузчик классов, а наш инструментальный код работает с загрузчиком классов Java. , когда мы обращаемся к нему, он бросает исключение «Workbench еще не создано», в то время как рабочий стол запущен и работает. (Надеюсь, это из-за разных загрузчиков классов для них обоих).

Я пробовал делать вещи от here, но безуспешно. Есть ли способ, которым мы можем работать с RCP-приложением с помощью инструментария Java.

ответ

0

Когда вы обрабатываете класс, ссылки на вставленный код разрешаются ClassLoader модифицированного класса. Если этот загрузчик классов не делегирует загрузку приложения, например. потому что это основано на правилах и не знает ваших конкретных классов инструментов, которые вы не можете обеспечить делегированием.

Что вы можете сделать:

  • Используйте переопределение доступа к define classes в рамках загрузчика инструментальным класса. Поскольку defineClass - final, загрузчик классов пакетов не может его перехватить. Однако ссылки этих введенных классов снова разрешаются загрузчиком пакетов, поэтому вам необходимо добавить все классы необходимых инструментов.
  • Поскольку загрузчик класса пулов будет сделать делегирование родительского загрузчика для официальных классов Java API, вы можете применить один из основных классов Java для добавления вспомогательного метода, который будет вызываться инструментальными классами и делегатами для вашего инструментария классы, которые должны были быть added to the boostrap loader
  • Вы можете использовать трюк, описанный в answer you have already linked, для ввода MethodHandle в свойства системы. Инструментированные классы могут извлекать и вызывать его, так как MethodHandle - это основной класс, который будет корректно разрешен загрузчиком пакетов, и базовый метод может быть вызван без доступа к его определяющему классу (если предположить, что параметры и возвращаемые типы являются либо примитивными типами, либо основные классы).
+0

У последнего метода есть проблема, о которой вы должны знать, если у вас несколько приложений в одной JVM. Например, когда вы развертываете несколько войн в контейнере сервлетов. Проблема в том, что MethodHandle указывает только на один экземпляр вашего класса, когда вам, вероятно, нужен отдельный экземпляр для каждого приложения. – Felix

+1

@Felix: это может обрабатываться с помощью клавиш, например. если вы используете инструментальные классы (объекты класса) в качестве ключей, конфликт невозможен. Тем не менее, модуляция Java 9 может создать новые препятствия, но, возможно, и новые решения ... – Holger

Смежные вопросы