6
votes

Java Annotation - Comment obtenir des propriétés et des cours dans le processeur

pour l'annotation Java sur mesure suivante

String classname = ((TypeElement)e).getQualifiedName().toString();


3 Réponses :


-1
votes

Il est compilé l'heure. Je pense que le compilateur n'est même pas fini de compiler le code source. Vous récupérez de telles informations à partir de l'instance AnnotationElement, qui vous donnera des informations pertinentes sur le type que vous avez annotées, mais pas ses propriétés d'exécution, elles ne sont pas encore disponibles car les fichiers de classe correspondants ne sont pas encore chargés par la machine virtuelle. Et le compilateur n'est même pas garanti d'exécuter sous une machine virtuelle pour Java. Il n'est donc pas chargé de pouvoir charger des fichiers de classe. Son exigence est uniquement de pouvoir produire des bytecodes que toute machine virtuelle particulière peut lire.

Donc, allez vérifier sur l'API miroir et pour toutes les informations pertinentes sur la classe / la méthode / le champ que vous avez annotées, vérifiez sur AnnotaTeElement représentant cette instance.

Et de côté NOTE: Ceci est l'information est exactement ce que j'ai raisonné, donc ce n'est peut-être pas la vérité réelle.


2 commentaires

Comment pensez-vous supprimer, remplacer, etc. Annotations Tout le travail? Ils doivent être capables de lire les objets de classe;)


Avez-vous déjà essayé d'avoir une instance de l'annotation de remplacement au moment de l'exécution? Vous ne pouvez pas car il n'est pas compilé dans le fichier de classe. Il est jeté avant même avant la compilation. Sa sémantique ne vérifie que s'il y a une définition de méthode Super Class, rien à voir si la source a été compilée ou non. Et les annotations de fichiers source sont représentées avec une annotationElement, afin de vous donner des informations sur les types annotés, mais pas de leurs propriétés d'exécution, pas au moment de la compilation. Pouvez-vous vérifier le fichier source d'annotationElement?



0
votes

Après avoir lu ceci Relié à la question , j'ai trouvé ce Excellente page de l'outil de traitement d'annotation Java ( Apt) . C'est à partir de 2005, donc peut-être pas le meilleur moyen de le faire ces jours-ci.

apt [...] est un outil de traitement d'annotation pour Java. Plus spécifiquement, APT vous permet de brancher le code pour gérer les annotations dans un fichier source car la compilation de code est survenue - et dans ce processus, vous pouvez émettre des notes, des avertissements et des erreurs.


1 commentaires

C'était l'un des 4 sites que j'ai principalement référencés. Le problème est que je ne pouvais trouver aucune information. Le problème est vraiment avec essayer de passer une classe. Si vous utilisez une chaîne, etc., c'est vraiment simple, mais lorsque vous essayez de mettre une classe, il devient fou compliqué. C'est ce que le lien de ma première mise à jour discute.



1
votes

J'allais vous diriger dans la direction du blog http://blog.reep.org/2009/02/13/geting-class-values-de-annotations-in-an-annotationProcessor/ , mais on dirait Vous avez déjà trouvé celui-là.

Je vois que vous avez compris comment accéder à l'élément MyApplication, donc je ne couvrirai donc pas cela ...

L'exception que vous voyez contient en fait le type de la propriété d'annotation dans ce. Vous pouvez donc faire référence à la valeur de clazz d'annotation lorsque vous attrapez l'exception: xxx

Oui, il s'agit d'un piratage total d'une solution, et je ne sais pas pourquoi les développeurs de l'API a décidé d'aller cette direction avec la fonctionnalité du processeur d'annotation. Cependant, j'ai vu un certain nombre de personnes implémenter ceci (y compris moi-même ), et l'article mentionné décrit également cette technique. Cela semble être une solution acceptable pour le moment.

en termes de "saisir" les valeurs de la classe pour myAplicationCode et soméclasse, vous ne pourrez pas le faire si elles sont compilées. Cependant, vous pouvez utiliser les représentations Element et Typemirror pour effectuer une validation de haut niveau sur vos classes (méthode, champ, noms de classe, annotations présentes, etc.)


0 commentaires