2017-03-12 2 views
1

J'ai quelques paquets dans une bibliothèque qui contiennent des annotations et des classes de base. J'étend javax.annotation.processing.AbstractProcessor dans le contexte de cette question.Est-il possible d'obtenir tous les TypeElements dans un package dans un environnement de traitement des annotations?

Existe-t-il un moyen d'obtenir un List/Array/Set de java.lang.TypeElement pour tous les types déclarés dans un paquet? Ou même des éléments?

Actuellement, j'ai une solution de contournement qui marque les classes dans des groupes en utilisant une annotation sur un type qui n'existe que pour indiquer des groupes d'objets connexes dans la bibliothèque. Existe-t-il un moyen plus simple de regrouper les types par package (c'est-à-dire par emplacement) plutôt que par déclaration explicite?

Répondre

2

trouvé la réponse - je la variable d'instance ProcessingEnvironment (dans mon sous-classe AbstractProcessor) pour obtenir javax.lang.model.util.Elements par exemple pour effectuer élément vraiment utile/Type/Accès Paquet:

List<TypeMirror> typeMirrorsInPackage = processingEnv.getElementUtils() 
       .getPackageElement("com.example.sample.annotations") 
       .getEnclosedElements() 
       .stream() 
       .map(Element::asType) 
       .filter(mirror -> mirror.getKind() == TypeKind.DECLARED) 
       .collect(Collectors.toList()); 

Attention, selon le javadoc: S'il s'agit d'un élément générique, un type prototypique est renvoyé. C'est l'invocation de l'élément sur les variables de type correspondant à ses propres paramètres de type formels. Apparemment, la classe Types a des méthodes utilitaires plus utiles pour gérer les génériques.