从运行时动态获取枚举值 [英] Get Values from Enum dynamically at Runtime
问题描述
我的枚举类型 -
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屋!