2013-05-07 7 views
5

注釈プロセッサでEnum値を取得する方法がわかりません。注釈プロセッサ:TypeMirrorまたはTypeElementからすべてのenum値を取得

私の注釈は、カスタムJava Beanが検証注釈です:私の注釈プロセッサで

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

、私はこれらのインスタンスにアクセスすることができます

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

私はそれが私の列挙についてのデータが含まれています知っています私はデバッグモードでそれを見ることができるからです。私も参照してくださいElementKind == Enum

しかし、私はその列挙体のすべての名前を取得したい、誰かが私を助けてください。


編集:我々は注釈プロセッサではなく、スタンダールJavaのリフレクションコードであるので、私は、この列挙型のClassオブジェクトにアクセスすることはできません。だから私はClass#getEnumConstants()またはEnumSet.allOf(MyEnum.class)を呼び出すことはできません。上記のタイプからどのようにClassオブジェクトを取得できるか教えてください。

+0

は、任意のアイデアを誰が持っていますか? –

答えて

4

が、私は解決策を見つけた(これはグアバ使用しています):

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

誰かがeclipseでこれをやろうとしているのなら、[バグ](https://bugs.eclipse.org/bugs/show_bug.cgi?id=357494)があるので、すべてのフィールド'getKind()'から 'ElementKind.ENUM_CONSTANT'を返してください。 – Alex

+0

私にとっては、機能的なスタイルはクロージャなしではあまり役に立たないようです。従来のスタイルでコードを書き直すと、次のようになります。 'List values = new ArrayList <>(); for(要素要素:type.getEnclosedElements()) if(element.getKind()== ENUM_CONSTANT) values.add(element.getSimpleName()。toString()); 戻り値。 ' –

-1

完全な例です。 enum値に対してgetEnumConstantsを使用することに注意してください。

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); 
      } 

     }         
    } 
} 

これは、プリントアウトします:

Three 
One 
Two 
Three 
+0

前述のとおり、Classオブジェクトにはアクセスできません。もし私が教えてくれれば:) –

関連する問題