通过反射获取枚举值

时间:2017-12-15 11:33:32

标签: java reflection enums jaxb

我正在尝试遍历并在运行时打印给定Enum类的所有ENUM值。但我似乎只能返回与值相关的常量。大多数解决方案都指向使用getEnumConstants(),values()或valueOf(),但我无法让它们按预期工作。

我能找到的最接近的问题是Get value of enum by reflection how-to-get-all-enum-values-in-java,但它们显然不同,以至于解决方案不符合我的要求。下面是我尝试过的代码以及自动生成且不可变的ENUM类:

Class cls = Class.forName("TestEnum");
for (Object obj : cls.getEnumConstants()) 
{
    System.out.println(obj.toString()); //prints TEST___A (not TEST_1)
    System.out.println(Enum.valueOf(cls, obj.toString()));  //prints TEST___A (not TEST_1)
}

和ENUM:

@XmlType(name = "TestEnum")
@XmlEnum
public enum TestEnum {

    @XmlEnumValue("TEST_1")
    TEST___A("TEST_1"),
    @XmlEnumValue("TEST_2")
    TEST___B("TEST_2");
    private final String value;

    TestEnum(String v) {
        value = v;
    }

    public String value() {
        return value;
    }

    public static TestEnum fromValue(String v) {
        for (TestEnum c: TestEnum.values()) {
            if (c.value.equals(v)) {
                return c;
            }
        }
        throw new IllegalArgumentException(v);
    }

期望的输出:

TEST_1
TEST_2

实际输出:

TEST___A
TEST___B

如果我理解这些自动生成的类正在做什么以及它们的用途,这可能会更容易?

2 个答案:

答案 0 :(得分:0)

也许是这样的事情(不需要反思):

enum MyEnum {
    TEST____1("TEST_1"),
    TEST____2("TEST_2");

    final String value;

    MyEnum(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }
}

public void test(String[] args) {
    for (MyEnum e : MyEnum.class.getEnumConstants()) {
        System.out.println(e.toString() + " - " + e.getValue());
    }
}

甚至

enum MyEnum {
    TEST____1("TEST_1"),
    TEST____2("TEST_2");

    final String value;

    MyEnum(String value) {
        this.value = value;
    }

}

public void test(String[] args) {
    for (MyEnum e : MyEnum.class.getEnumConstants()) {
        System.out.println(e.toString() + " - " + e.value);
    }
}

答案 1 :(得分:0)

终于明白了:

Class cls = Class.forName("TestEnum");
for (Object obj : cls.getEnumConstants()) {
   try {
       Method m = cls.getMethod("value", null);
       System.out.println(m.invoke(obj, null));
   } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException ex) {
       System.out.println("could not find enum");
   }
}