Je me rends compte que cela pourrait être une question qui a été posée et répondue, mais veuillez supporter avec moi. P>
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. P>
maintenant sur Internet La réponse de base que je reçois est non, mais ce gars l'a fait: p>
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)? P>
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. P>
merci p>
4 Réponses :
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). P>
Il utilise très certainement un processeur d'annotation, c'est juste que c'est implicite. La commande Comme il utilise cette commande pour compiler: p>
Nous voyons qu'il a modifié le chemin de classe pour inclure le Pourquoi ne pas simplement envoyer par courrier électronique le gars et demander s'il vous donnera le code? p> javac code> recherchera le chemin de classe des processeurs d'annotation si non explicitement définis. p>
Javac -CP ~ / Développement / Panno / Build / Hanhuy-Panno.jar * .java Code> P>
Hanhuy-Panno.jar code>, qui contiendra le processeur d'annotation. P>
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
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 ... p>
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.
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. P>
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). P>
EDIT: Toute personne intéressée par cette zone devrait consulter Projet Lombok . P>
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.
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. P>
J'ai écrit un ensemble d'annotations générant des getters / setters et d'autres trucs amusants. Je génère une superclasse. P>
voir http://code.google .com / p / javadude / wiki / annotations p>
Vous pouvez faire des choses comme p> et il générera Persongen pour vous avec les champs / getters / setters et support de propriété lié. P> p>
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.
Je suppose qu'il pourrait éventuellement faire ce JCP.org/en/jsr/detail?id= 269 ?