首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >注释处理器:从TypeMirror或TypeElement获取所有枚举值

注释处理器:从TypeMirror或TypeElement获取所有枚举值
EN

Stack Overflow用户
提问于 2013-05-07 16:28:51
回答 3查看 2.8K关注 0票数 6

我不明白如何在注释处理器中检索Enum值。

我的注释是一个自定义Java验证注释:

代码语言:javascript
复制
  @StringEnumeration(enumClass = UserCivility.class)
  private String civility;

在我的注释处理器上,我可以访问这些实例:

代码语言:javascript
复制
javax.lang.model.element.AnnotationValue
javax.lang.model.type.TypeMirror
javax.lang.model.element.TypeElement

我知道它包含关于我的枚举的数据,因为我可以在调试模式中看到它。我也看到了ElementKind == Enum

但是我想知道所有的名字,谁能帮我。

编辑:我不能访问这个Enum的对象,因为我们是在一个注释处理器中,而不是在standart反射代码中。因此,我不能调用Class#getEnumConstants()EnumSet.allOf(MyEnum.class),除非您告诉我如何从上面提到的类型中获取Class对象。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-05-13 09:44:50

我找到了一个解决方案(它使用了番石榴):

代码语言:javascript
复制
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();
}
票数 5
EN

Stack Overflow用户

发布于 2020-06-11 16:46:27

Sebastian给出的答案是正确的,但是如果您使用的是Java 8或更高版本,您可以使用以下(更干净)的方法,而不是使用Google。

代码语言:javascript
复制
List<String> getEnumValues(TypeElement enumTypeElement) {
    return enumTypeElement.getEnclosedElements().stream()
            .filter(element -> element.getKind().equals(ElementKind.ENUM_CONSTANT))
            .map(Object::toString)
            .collect(Collectors.toList());
}
票数 0
EN

Stack Overflow用户

发布于 2013-05-07 18:53:06

下面是一个完整的例子。注意在枚举值上使用getEnumConstants。

代码语言:javascript
复制
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);
            }

        }                                   
    }
}

这将打印出来:

代码语言:javascript
复制
Three
One
Two
Three
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16424066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档