2009-12-14 7 views
4

J'expérimente les processeurs d'annotation java et j'essaie de comprendre l'utilisation des classes dans "javax.lang.model". Pour ce que j'ai lu, je pense que le ElementVisitor doit être conçu comme le moyen principal de travailler avec le modèle. Mais je ne comprends pas comment l'utiliser correctement.Comment utiliser "javax.lang.model.element.ElementVisitor"?

Je connaissais le modèle de visiteur. Jusqu'à présent, je l'ai utilisé pour éviter les itérations sur les enfants d'un élément (et les enfants des enfants ...) et éviter les tests "instanceof" laids. Mais ce visiteur semble être différent. Si j'appelle "accepter" sur un élément de modèle, il ne rend pas visite aux enfants mais seulement à l'élément lui-même.

Est-ce que quelqu'un pourrait vous aider à utiliser l'API?

J'ai trouvé le lien suivant: http://www.cs.bgu.ac.il/~gwiener/programming/visitors-galore/#more-113. Mais en utilisant un visiteur à l'intérieur de l'autre à l'intérieur de l'autre ... ne vous sentez pas juste!?

Modifier: Pour faciliter la compréhension de la question, copiez le code à partir du lien ci-dessus. Le code suivant ne semble pas être "juste". Je ne peux pas croire qu'une API Java officielle est conçue de cette manière. Mais comment utiliser l'ElementVisitor correctement?

tElem.accept(new SimpleElementVisitor6<Void, ...>() { 
    public Void visitType(TypeElement e, ...) { 
    for (Element tSubElem : e.getEnclosedElements()) { 
     tSubElem.accept(new SimpleElementVisitor6<AssocEndSpec, ...>() { 
     public AssocEndSpec visitExecutable(ExecutableElement ex, ...) { 
      TypeMirror tRetTypeMirror = ex.getReturnType(); 
      tRetTypeMirror.accept(new SimpleTypeVisitor6<TypeElement, TypeElement>() { 
      public TypeElement visitDeclared(DeclaredType t, TypeElement enclose) { 
       for (TypeMirror tTypeArgMirror : t.getTypeArguments()) { 
       tTypeArgMirror.accept(new SimpleTypeVisitor6<TypeElement, ...>() { 
        public TypeElement visitDeclared(DeclaredType t, TypeElement self) { 
        TypeElement tArgTypeElem = (TypeElement) t.asElement(); 
        if (!self.equals(tArgTypeElem)) { 
         // found the little bugger! 
        } 
        } 
       }, ...); 
       } 
      } 
      }, ...); 
     } 
    }, ...); 
    } 
}, ...); 

Répondre

4

Ce code est des bollocks.

Jetez un oeil à javax.lang.model.util.ElementKindVisitor6 ou javax.lang.model.util.ElementScanner6, ils pourraient faire quoi. Dans tous les cas, vous devriez pouvoir prendre leurs sources et les adapter à vos besoins.

 

NB: qui dit, oui, je dirais aussi que ElementVisitor est une mise en œuvre assez étrange d'un visiteur.

+0

ElementScanner6 était ce que je recherchais. Bien que je ne sache toujours pas quoi faire avec les autres implémentations ... sans traversée du composite elles semblent plutôt inutiles. Merci pour le conseil! – Arne