9
votes

Les annotations peuvent-elles être utilisées pour l'injection de code?

Je me rends compte que cela pourrait être une question qui a été posée et répondue, mais veuillez supporter avec moi.

Je veux savoir s'il est possible d'utiliser des annotations pour injecter du code dans vos cours de compilation. L'exemple classique consiste à générer un getter et un setter pour les membres de votre objet. Ce n'est pas exactement ce dont j'en ai besoin, mais il sert à illustrer l'idée de base.

maintenant sur Internet La réponse de base que je reçois est non, mais ce gars l'a fait:

texte de lien

Est-ce que quelqu'un sait comment il fait ce qu'il fait (et s'il fait en fait ce qu'il dit qu'il dit)?

L'essentiel est qu'il n'utilise pas de processeur d'annotation pour générer un nouveau fichier Java à compiler. Cette technique que je suis consciente et ne fonctionnera pas à notre objectif.

merci


1 commentaires

Je suppose qu'il pourrait éventuellement faire ce JCP.org/en/jsr/detail?id= 269 ​​?


4 Réponses :


1
votes

Quelque chose doit traiter les annotations, il se produit donc au moment de la compilation avec un processeur d'annotation ou au moment de la réflexion (oui je sais, il y a encore plus de façons exotiques de le faire au moment de l'exécution).

Il utilise très certainement un processeur d'annotation, c'est juste que c'est implicite. La commande javac recherchera le chemin de classe des processeurs d'annotation si non explicitement définis.

Comme il utilise cette commande pour compiler:

Javac -CP ~ / Développement / Panno / Build / Hanhuy-Panno.jar * .java

Nous voyons qu'il a modifié le chemin de classe pour inclure le Hanhuy-Panno.jar , qui contiendra le processeur d'annotation.

Pourquoi ne pas simplement envoyer par courrier électronique le gars et demander s'il vous donnera le code?


1 commentaires

Oui, je me rends compte qu'il utilise un processeur d'annotation, la question est plus ce qu'il y fait. Je l'ai envoyé, mais je n'ai pas encore reçu de réponse. Merci



5
votes

Il n'est pas pris en charge pour modifier le code au moment de la compilation, mais il semble être possible en utilisant des API internes Javac-internes non prises en charge, ici est un post qui fait référence à la solution Hanbuy-Panno avec également un lien vers le code ...


1 commentaires

Merci beaucoup. Ce deuxième lien est exactement ce que je cherchais. Maintenant, je peux voir comment il le fait et décider s'il s'agit d'une bonne / mauvaise idée de le faire de cette façon.



3
votes

Je suis allé chercher Quelque chose de similaire l'an dernier. Il n'y a pas de moyen standard de modifier les classes à l'aide de processeurs d'annotation ou du compilateur et de la documentation API d'annotation recommande de créer des décorateurs.

Si vous êtes prêt à vivre avec les hacks, consultez Utilisation de Adrian Kuhn de la API privée où il Ajoute les littéraux romains du chiffre romain à Java . Cette approche est limitée au compilateur Sun Javac et vous auriez besoin de mettre en œuvre autre chose si vous en avez utilisé un autre (comme le compilateur Eclipse).


EDIT: Toute personne intéressée par cette zone devrait consulter Projet Lombok .


1 commentaires

Ah, je vois ce que vous voulez dire de vous limiter à un certain compilateur. Cela pourrait être un problème. Merci pour la réponse.



2
votes

Vous pouvez le faire, mais vous n'êtes pas censé modifier la classe contenant les annotations. (L'astuce que vous liez pour utiliser l'API d'arborescence de compilation pour modifier le byTecode en étant généré ...) Ce n'est pas pris en charge et sera probablement gardé contre dans les SDK Java ultérieurs.

La manière appropriée de le faire est de générer une superclasse , classe de sous-classe ou d'emballage.

J'ai écrit un ensemble d'annotations générant des getters / setters et d'autres trucs amusants. Je génère une superclasse.

voir http://code.google .com / p / javadude / wiki / annotations

Vous pouvez faire des choses comme xxx

et il générera Persongen pour vous avec les champs / getters / setters et support de propriété lié.


2 commentaires

Merci pour la réponse, mais comme je l'ai dit dans ma question initiale, générer d'autres fichiers Java n'est pas une solution idéale dans notre cas. Bien que je suis d'accord que l'utilisation de l'API d'arbre de compilation n'est pas idéale non plus.


Toute raison particulière Code Gen ne fonctionnera pas pour vous? N'oubliez pas que non seulement l'API d'arborescence de code non idéal cet objectif, il est explicitement indiqué dans les Documents APT qu'il est illégal.