2017-06-25 1 views
0

Je veux une classe PersonCollector pour injecter un champ par des classes spécifiques qui ont l'annotation PersonResolver. PersonCollector vérifie si la classe annotée a une valeur d'annotation qui correspond au champ PersonCollector.personType. Si elle est conforme, la logique ajoutera la classe qui implémente cette annotation et l'affectera au champ PersonCollector.personByType.Comment obtenir les annotations d'une classe d'implémentation des interfaces

Mon problème ici est que j'ai une interface Personne et deux classes de mise en œuvre CoolPerson & UncoolPerson à la fois annotée avec l'annotation @PersonResolver et une valeur qui spécifie leur type avec le Enum PersonType . Le seul moyen de rechercher toutes les implémentations qui contiennent l'interface spécifique est d'appeler Personne, c'est-à-dire Person.class.getAnnotations(). Cela ne génère malheureusement que les annotations déclarées sur l'interface Person.

Ce n'est pas ce que je veux réellement. J'aimerais une liste de toutes les implémentations de Personne qui possèdent l'annotation - pas la personne elle-même.

Voici le code pseudo/scratch pour ce que je veux atteindre:

@PersonResolver

@Target(ElementType.TYPE) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface PersonResolver { 
    PersonType value(); 
} 

Les deux implémentations

@PersonResolver(PersonType.COOL) 
public class CoolPerson implements Person { 
    // implementation 
} 

@PersonResolver(PersonType.UNCOOL) 
public class UncoolPerson implements Person { 
    // implementation 
} 

PersonCollector

public class PersonCollector { 
    private PersonType personType; 
    private Person personByType; 

    public PersonCollector(PersonType personType) { 
    this.personType = personType; // PersonType.COOL 

    Annotation[] annotations = Person.class.getDeclaredAnnotation(PersonResolver.class); 

    // What I'd like to get are ALL classes that implement the "Person" interface 
    // and have the "PersonResolver" Annotation. 

    // PseudoCode! 
    if (annotations[0].value == personType) { 
     this.personByType = annotations[0].getClassThatImplementsMe(); // CoolPerson instance is assigned to the field 
    } 
    } 
    // ... 
} 

Répondre

0

Vous pouvez utiliser une bibliothèque telle que Reflections qui analysera le chemin de classe pour les types annotés avec PersonResolver. Par exemple, le code suivant renvoie un ensemble de java.lang.Class es annoté avec @PersonResolver et dont l'attribut value() est égal à personType.

Reflections reflections = new Reflections(("com.myproject")); 
Set<Class<?>> annotated = reflections.getTypesAnnotatedWith(PersonResolver.class) 
     .stream() 
     .filter(c -> c.getAnnotation(PersonResolver.class).value() == personType) 
     .collect(Collectors.toSet());