6

注釈プロセッサで Enum 値を取得する方法がわかりません。

私の注釈は、カスタム Java Bean Validation 注釈です。

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

私の注釈プロセッサでは、次のインスタンスにアクセスできます。

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

デバッグモードで見ることができるので、列挙型に関するデータが含まれていることがわかります。私も見るElementKind == Enum

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


編集:この Enum の Class オブジェクトにはアクセスできません。これは、標準の Java リフレクション コードではなく、注釈プロセッサにいるためです。したがって、上記の型から Class オブジェクトを取得する方法を教えていただけない限り、Class#getEnumConstants()orを呼び出すことはできません。EnumSet.allOf(MyEnum.class)

4

3 に答える 3

5

私は解決策を見つけました(これは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();
}
于 2013-05-13T09:44:50.917 に答える
0

Sebastian の回答は正しいですが、Java 8 以降を使用している場合は、Google Guava を使用するよりも次の (よりクリーンな) アプローチを使用できます。

List<String> getEnumValues(TypeElement enumTypeElement) {
    return enumTypeElement.getEnclosedElements().stream()
            .filter(element -> element.getKind().equals(ElementKind.ENUM_CONSTANT))
            .map(Object::toString)
            .collect(Collectors.toList());
}
于 2020-06-11T16:46:27.280 に答える