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?
- Comment?
- 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.
- 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.
- 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.
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
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) –