从运行时动态获取枚举值 [英] Get Values from Enum dynamically at Runtime

查看:321
本文介绍了从运行时动态获取枚举值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的枚举类型 -

  public enum Foo {A,B,C} 

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

我在运行时是枚举类名称,即Foo



我这样做 -

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

使用 Arrays.asList(c.getEnumConstants())获取我 -



Foo -

  [A,B,C] 

/ p>

  [aaa,bbb,ccc] 

当评估 Bar 时,我也想要 [A,B,C] / p>

.values()是我想要的,但是如何在没有任何明确的转换的情况下动态地获得它?



找到解决方案 -



 列表<?扩展枚举>> enums =(List<?extends Enum<?>>)Arrays.asList(c.getEnumConstants()); (枚举<?> e:枚举)
{
System.err.println(e.name:+ e.name());
}


解决方案

我怀疑你的 Arrays.asList(c.getEnumConstants())实际上正常工作。当您打印阵列时,您看到的是 toString() Bar 的结果的列表,成为 [aaa,bbb,ccc]



尝试如下:


$ b $ (b b:Bar.class.getEnumConstants()){pre> {
System.out.println(b.name()+(\+ b.toString()+\));
}

你应该看到我的意思。



如果你有一个定义自己的 toString()枚举,你可以尝试包装它:

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

public EnumNamer(T){
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()+\));
}
}

现在你已经澄清了几点 - 这个工程对我来说:

  //只要我们知道它的枚举,这个演员应该是OK的。 
类<枚举> c =(Class&Enum>)Class.forName(Bar.class.getName()); (enum e:c.getEnumConstants())
{
EnumNamer en = new EnumNamer(e);
System.out.println(en +(\+ en.toString()+\));
}


My enum types-

public enum Foo {A, B, C}

And

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

All I have at runtime is the enum class name i.e. "Foo"

I do this -

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

Using Arrays.asList(c.getEnumConstants()) gets me -

Foo -

[A, B, C]

Bar -

[aaa, bbb, ccc]

I also want [A, B, C] when evaluating Bar.

.values() is what I want but how do I get to it dynamically without any explicit casting?

Many thanks for any replies.

Have found the solution -

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

解决方案

I suspect your Arrays.asList(c.getEnumConstants()) is actually working correctly. What you are seeing when you print the array out is a list of the toString() results of Bar which become [aaa, bbb, ccc].

Try something like:

for (Bar b : Bar.class.getEnumConstants()) {
  System.out.println(b.name() + "(\"" + b.toString() + "\")");
}

You should see what I mean.

If you have an enum that defines its own toString() you could try wrapping it:

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() + "\")");
  }
}

Now you've clarified a few points - this works for me:

// This cast should be OK so long as we KNOW its an enum.
Class<Enum> c = (Class<Enum>)Class.forName(Bar.class.getName());
for (Enum e : c.getEnumConstants()) {
  EnumNamer en = new EnumNamer(e);
  System.out.println(en + "(\"" + en.toString() + "\")");
}

这篇关于从运行时动态获取枚举值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆