Можно ли манипулировать байт-кодом при использовании OSGi? - PullRequest
9 голосов
/ 19 февраля 2009

Я делаю сервером приложений , и в нем мне нужно использовать некоторые манипуляции с байт-кодом (например, вставка пользовательских методов equals и hashCode в классы, помеченные @Entity). Теперь я даю JVM Java-агент (опция -javaagent ), который выполняет преобразования байт-кода с использованием ASM .

Я рассматривал возможность использования OSGi , но я не знаю, позволяет ли это мне выполнить необходимые манипуляции с байт-кодом.

  1. Можно ли манипулировать байт-кодом при использовании OSGi? Как?
  2. Возможно ли для пакета объявить себя, что для его работы требуется некоторое манипулирование байт-кодом? Например, серверу приложений требуется манипулирование некоторыми из его основных классов.
  3. Можно ли указать, что какой-то другой пакет требует некоторой манипуляции с байт-кодом, но этот пакет не знает об этом? Например, все приложения, работающие на сервере, должны обрабатываться, но приложениям не нужно знать об этом.
  4. Возможно ли для пакета объявить себя, что все пакеты, которые зависят от него, должны манипулироваться байт-кодом? Это позволило бы мне легко заявить, что все, кто зависит от пакета API, который содержит аннотацию @Entity, должны манипулировать.

Ответы [ 2 ]

7 голосов
/ 25 октября 2011

OSGI 4.3 добавил WeavingHook , который позволяет вам выполнять манипулирование байтовым кодом с помощью манипулятора байтового кода по вашему выбору. Я использую его с JavaAssist в одном из моих проектов, и он прекрасно работает.

3 голосов
/ 19 февраля 2009

1) Да, в OSGi возможно манипулирование байт-кодом. Чем немного отличается от стандартного Java, вам нужно использовать шаблон расширения, описанный здесь http://www.osgi.org/blog/2007/02/osgi-extender-model.html. Я полагаю, что Eclipse использует это в своем проекте аспекта равноденствия: http://www.eclipse.org/equinox/incubator/aspects/. Spring DM определенно использует этот шаблон для автоматической настройки модуля osgi dm.

2) это будет соответствовать используемому вами шаблону экстендера. Вот как работает средство расширения пружин, ища файлы конфигурации в папке пакета META-INF / spring до того, как они будут запущены платформой.

3) Опять же, это зависит от заданного вами экстендера.

4) Я полагаю, что это было бы возможно, поскольку до того, как пакет может быть запущен, он должен быть разрешен и запущены зависимости, ваш расширитель может затем проанализировать зависимости пакета и запустить манипулирование байтовым кодом.

...