2013-05-07 17 views
5

Non capisco come sia possibile recuperare i valori Enum in un processore di annotazione.Processore di annotazione: ottiene tutti i valori enum da TypeMirror o TypeElement

La mia annotazione è una consuetudine Java Bean Validation annotazione:

@StringEnumeration(enumClass = UserCivility.class) 
    private String civility; 

Sul mio processore annotazione, posso accedere alle istanze di questi:

javax.lang.model.element.AnnotationValue 
javax.lang.model.type.TypeMirror 
javax.lang.model.element.TypeElement 

So che contiene i dati di circa il mio enum dal momento che posso vedere che in modalità di debug. Vedo anche ElementKind == Enum

Ma voglio ottenere tutti i nomi per quell'Enum, qualcuno può aiutarmi per favore.


Edit: Non ho accesso all'oggetto classe di questo Enum, perché siamo in un processore annotazione, e non in standart codice di riflessione Java. Quindi non posso chiamare Class#getEnumConstants() o EnumSet.allOf(MyEnum.class) a meno che tu non mi dica come posso ottenere l'oggetto Class dai tipi menzionati sopra.

+0

Qualcuno ha idea? –

risposta

4

ho trovato una soluzione (questo usa Guava):

class ElementKindPredicate<T extends Element> implements Predicate<T> { 
    private final ElementKind kind; 
    public ElementKindPredicate(ElementKind kind) { 
     Preconditions.checkArgument(kind != null); 
     this.kind = kind; 
    } 
    @Override 
    public boolean apply(T input) { 
     return input.getKind().equals(kind); 
    } 
} 

private static final ElementKindPredicate ENUM_VALUE_PREDICATE = new ElementKindPredicate(ElementKind.ENUM_CONSTANT); 

public static List<String> getEnumValues(TypeElement enumTypeElement) { 
    Preconditions.checkArgument(enumTypeElement.getKind() == ElementKind.ENUM); 
    return FluentIterable.from(enumTypeElement.getEnclosedElements()) 
     .filter(ENUM_VALUE_PREDICATE) 
     .transform(Functions.toStringFunction()) 
     .toList(); 
} 
+0

Se qualcuno sta provando a farlo con eclipse, c'è un [bug] (https://bugs.eclipse.org/bugs/show_bug.cgi?id=357494) che causa tutti i campi nel tuo enum per restituire 'ElementKind.ENUM_CONSTANT' da' getKind() '. – Alex

+0

Per me lo stile funzionale sembra non molto utile senza chiusure. Riscrivere il codice in uno stile tradizionale lo rende: 'Elenco valori = new ArrayList <>(); per (Elemento elemento: type.getEnclosedElements()) if (element.getKind() == ENUM_CONSTANT) values.add (element.getSimpleName(). ToString()); valori di ritorno; ' –

-1

Ecco un esempio completo. Si noti l'uso di getEnumConstants sui valori enum.

public class Annotate { 

    public enum MyValues { 
     One, Two, Three  
    }; 

    @Retention(RetentionPolicy.RUNTIME) 
    public @interface StringEnumeration { 
     MyValues enumClass();   
    } 

    @StringEnumeration(enumClass = MyValues.Three) 
    public static String testString = "foo"; 

    public static void main(String[] args) throws Exception { 

     Class<Annotate> a = Annotate.class; 
     Field f = a.getField("testString"); 
     StringEnumeration se = f.getAnnotation(StringEnumeration.class); 
     if (se != null) { 
      System.out.println(se.enumClass()); 

      for(Object o : se.enumClass().getClass().getEnumConstants()) { 
       System.out.println(o); 
      } 

     }         
    } 
} 

Questo stamperà:

Three 
One 
Two 
Three 
+0

Come già detto, non ho accesso all'oggetto Class. Se posso, per favore, dirmi come :) –

Problemi correlati