2009-02-18 12 views
8

Je fais an application server et dans ce que j'ai besoin d'utiliser une manipulation de bytecode (par exemple en insérant des méthodes personnalisées equals et hashCode aux classes annotées avec @Entity). Maintenant, je donne à la JVM un agent Java (l'option -javaagent) qui effectue des transformations de type bytecode en utilisant ASM.Est-il possible de faire une manipulation de bytecode en utilisant OSGi?

J'envisageais d'utiliser OSGi, mais je ne sais pas si cela me permet de faire la manipulation nécessaire du bytecode. Est-il possible de faire une manipulation de bytecode lors de l'utilisation de OSGi?

  1. Comment?
  2. Est-il possible qu'un bundle se déclare lui-même, qu'il nécessite une manipulation de bytecode pour qu'il fonctionne? Par exemple, le serveur d'applications nécessite que certaines de ses propres classes de base soient manipulées.
  3. Est-il possible de spécifier qu'un autre bundle nécessite une manipulation de bytecode, sans que ce bundle ne le sache? Par exemple, toutes les applications qui s'exécutent sur le serveur doivent être manipulées, mais les applications n'ont pas besoin de le savoir.
  4. Est-il possible qu'un bundle se déclare lui-même, que tous les bundles qui en dépendent doivent être manipulés bytecode? Cela me permettrait de déclarer facilement que tous ceux qui dépendent du bundle d'API contenant l'annotation @Entity doivent être manipulés.

Répondre

3

1) Oui, il est possible de faire une manipulation de bytecode dans OSGi. Le comment est un peu différent de celui avec java standard, vous devez utiliser le modèle d'extension décrire ici http://www.osgi.org/blog/2007/02/osgi-extender-model.html. Je crois qu'Eclipse l'utilise dans son projet d'équinoxe: http://www.eclipse.org/equinox/incubator/aspects/. Spring DM utilise définitivement ce modèle pour configurer automatiquement le module osgi dm.

2) cela correspond au modèle d'extension que vous utilisez. C'est comme cela que fonctionne le Spring Extender, à la recherche de fichiers de configuration dans le dossier META-INF/spring de bundle avant qu'ils ne soient démarrés par la plate-forme.

3) Encore une fois, ce serait à la hauteur que vous définissez.

4) Je crois que cela serait possible car avant de pouvoir démarrer un paquet, il doit être résolu et les dépendances commencées, votre extendeur pourrait alors analyser les dépendances du paquet et commencer la manipulation du code d'octet.

+0

Le motif d'extension sur OSGi a très peu à voir avec la manipulation de bytecode. Les aspects Equinox utilisent la méthode spécifique à l'équinoxe pour installer un crochet flottant. Comme mentionné ci-dessous, depuis 4.3, il existe une façon standard de le faire. – aav

+0

aav, Je comprends que le modèle d'extension a peu à voir avec la manipulation bytecode, ce que je veux dire est un bon moment dans le cycle de vie osgi pour injecter un mécanisme de manipulation de code octet. Gardez aussi à l'esprit que j'ai écrit cette réponse avant qu'OSGi 4.3 ne soit annoncé! Il est assez clair que puisqu'une API réelle est supportée dans OSGi 4.3, c'est ce qui devrait être utilisé. Se référer à "Ci-dessous" est trompeur car l'ordre des réponses peut changer au fil du temps (et la bonne réponse est maintenant au-dessus) –

6

OSGI 4.3 a ajouté le WeavingHook qui vous permet d'effectuer une manipulation de code octet avec un manipulateur de code octet de votre choix. Je l'utilise avec JavaAssist sur un de mes projets et ça marche très bien.