69 votes

Ajout d'annotations Java à l'exécution

Est-il possible d'ajouter une annotation à un objet (dans mon cas en particulier, une Méthode) au moment de l'exécution?

Pour un peu plus d'explication: j'ai deux modules, moduleA et moduleB. moduleB dépend moduleA, qui ne dépend pas de quoi que ce soit. (modA est mon coeur de types de données et les interfaces, les modB est db/couche de données) modB dépend aussi de externalLibrary. Dans mon cas, modB est de passer au large d'une classe à partir de la modA de externalLibrary, qui a besoin de certaines méthodes pour être annotés. La des annotations spécifiques font tous partie de externalLib et, comme je l'ai dit, modA ne dépend pas de externalLib et je tiens à garder de cette façon.

Donc, est-ce possible, ou avez-vous des suggestions pour d'autres façons de regarder ce problème?

40voto

ChssPly76 Points 53452

Il est possible via l'instrumentation du bytecode à la bibliothèque comme Javassist.

En particulier, jetez un oeil à AnnotationsAttribute classe pour un exemple sur la façon de créer, de définir les annotations et la section tutoriel sur le bytecode de l'API pour les directives générales sur la façon de manipuler les fichiers de classe.

C'est tout sauf simple et directe, que je ne recommanderais PAS cette approche et vous suggérons d'envisager de Tom de répondre au lieu de cela, à moins que vous besoin de faire cela pour un grand nombre de classes (ou dit les classes ne sont pas disponibles jusqu'à ce moment de l'exécution et donc de l'écriture d'un adaptateur est impossible).

22voto

Tom Points 13036

Il n'est pas possible d'ajouter une annotation au moment de l'exécution. Il semble nécessaire d'introduire un adaptateur utilisé par le module B pour envelopper l'objet du module A, en exposant les méthodes annotées requises.

10voto

Leopardi Points 131

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X