Можно ли манипулировать байт-кодом при использовании OSGi?
Я делаю сервер приложений, и в нем мне нужно использовать некоторые манипуляции с байт-кодом (например, вставка пользовательских equals
а также hashCode
методы к классам аннотированы @Entity
). Теперь я даю JVM Java-агент (опция -javaagent), который выполняет преобразования байт-кода с использованием ASM.
Я думал об использовании OSGi, но я не знаю, позволяет ли он мне выполнять необходимые манипуляции с байт-кодом.
- Можно ли манипулировать байт-кодом при использовании OSGi? Как?
- Возможно ли для пакета объявить себя, что для его работы требуется некоторое манипулирование байт-кодом? Например, сервер приложений требует, чтобы некоторые его основные классы управлялись.
- Можно ли указать, что какой-то другой пакет требует некоторой манипуляции с байт-кодом, но этот пакет не знает об этом? Например, все приложения, которые запускаются на сервере, должны быть обработаны, но приложения не должны знать об этом.
- Возможно ли для пакета объявить себя, что все пакеты, которые зависят от него, должны манипулироваться байт-кодом? Это позволило бы мне легко заявить, что все, кто зависит от пакета 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) Я полагаю, что это было бы возможно, поскольку до того, как пакет может быть запущен, он должен быть разрешен и запущены зависимости, ваш расширитель может затем проанализировать зависимости пакета и начать манипулирование байтовым кодом.