在运行时动态获取Enum中的值

时间:2013-08-15 11:03:04

标签: java enums

我的枚举类型 -

public enum Foo {A, B, C}

public enum Bar {A("aaa"), B("bbb"), C("ccc")}

我在运行时所拥有的只是枚举类名,即“Foo”

我这样做 -

Class<?> c = Class.forName(getClassName()) // local function 

使用Arrays.asList(c.getEnumConstants())让我 -

Foo -

[A, B, C]

酒吧 -

[aaa, bbb, ccc]

评估[A, B, C]时,我也想要Bar

.values()是我想要的,但如何在没有任何显式转换的情况下动态获取它?

非常感谢任何回复。

找到了解决方案 -

List<? extends Enum<?>> enums = (List<? extends Enum<?>>) Arrays.asList(c.getEnumConstants());
for (Enum<?> e: enums) {
    System.err.println("e.name: " + e.name());
}

2 个答案:

答案 0 :(得分:1)

我怀疑你的Arrays.asList(c.getEnumConstants())实际上是在正常工作。打印阵列时所看到的是toString()成为Bar的{​​{1}}结果列表。

尝试类似:

[aaa, bbb, ccc]

你应该明白我的意思。

如果您有for (Bar b : Bar.class.getEnumConstants()) { System.out.println(b.name() + "(\"" + b.toString() + "\")"); } 定义了自己的enum,可以尝试将其包装:

toString()

现在你澄清了几点 - 这对我有用:

static class EnumNamer<T extends Enum<T>> {
  final T he;

  public EnumNamer(T he) {
    this.he = he;
  }

  @Override
  public String toString() {
    return he.name();
  }
}

public void test() {
  System.out.println("Hello");
  for (Bar b : Bar.class.getEnumConstants()) {
    System.out.println(b.name() + "(\"" + b.toString() + "\")");
    EnumNamer<Bar> en = new EnumNamer<>(b);
    System.out.println(en + "(\"" + en.toString() + "\")");
  }
}

答案 1 :(得分:0)

对于Bar您可以在检索常量时使用以下代码:

List<Bar> list = Arrays.asList(c.getEnumConstants());
List<String> list1 = new ArrayList<String>();
for (Bar b : list)
{
   list1.add(b.name());
}
System.out.println(list1);