L'ajout d'Annotations Java au moment de 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?
- Vérifier celui-ci peut être vous aider stackoverflow.com/a/14276270/4741746 à moins que l'on puisse le modifier
Vous devez vous connecter pour publier un commentaire.
Il n'est pas possible d'ajouter une annotation au moment de l'exécution, il semble que vous devez introduire une adaptateur que le module B utilise pour envelopper l'objet d'Un module d'exposer le nécessaire annoté méthodes.
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 section tutoriel sur le bytecode de l'API 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).
Il est également possible d'ajouter une Annotation à une classe Java lors de l'exécution à l'aide de la réflexion Java API. Essentiellement, on doit recréer l'intérieur d'Annotation des cartes définies dans la classe
java.lang.Class
(ou pour Java 8 définies dans la classe internejava.lang.Class.AnnotationData
). Naturellement, cette approche est tout à fait hacky et pourraient se briser à tout moment pour les nouvelles versions de Java. Mais pour rapide et sale de test et de prototypage cette approche peut être utile à la fois.Prouver de concept exemple pour Java 8:
Exemple d'utilisation:
De sortie:
Limites de cette approche:
Il est possible de créer des annotations au moment de l'exécution par l'intermédiaire d'un Proxy. Vous pouvez les ajouter à vos objets Java par la réflexion, comme l'a suggéré dans d'autres réponses (mais vous serait probablement mieux de trouver une autre façon de gérer qui, comme de jouer avec les types existants via la réflexion peut être dangereux et difficiles à déboguer).
Mais il n'est pas très facile... j'ai écrit une bibliothèque appelée, je l'espère, de façon appropriée, Javanna juste pour le faire facilement à l'aide d'un chiffon propre API.
C'est dans JCenter et Maven Central.
De l'utiliser:
Si une entrée de la carte ne correspond pas à l'annotation déclaré champ(s) et type(s), une Exception est levée. Si aucune valeur n'a pas de valeur par défaut est manquant, une Exception est levée.
Cela rend-il possible d'assumer toutes les annotations instance est créée avec succès est aussi sûr à utiliser comme un moment de la compilation d'annotation de l'instance.
Comme un bonus, cette lib pouvez également analyser l'annotation des classes et le retour aux valeurs de l'annotation comme une Carte:
C'est bien pour la création de mini-cadres.