Можно ли манипулировать байт-кодом при использовании OSGi?

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

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

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

2 ответа

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

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) Я полагаю, что это было бы возможно, поскольку до того, как пакет может быть запущен, он должен быть разрешен и запущены зависимости, ваш расширитель может затем проанализировать зависимости пакета и начать манипулирование байтовым кодом.

Другие вопросы по тегам