枚举反射

时间:2014-11-29 11:40:43

标签: java reflection enums

我尝试在反射中创建此行但未能生成EnumTitleAction.SUBTITLE

new ClassA(EnumB.SUBTITLE, "Test");

怎么做?

我已经尝试过这样做了:

Class.forName("net.something.ClassA").getConstructors()[1].newInstance(/*Stuck with EnumB*/, "Test");

但是我无法找到如何用反射来表示EnumB部分。

2 个答案:

答案 0 :(得分:1)

枚举值是对象 - 只需像在第一个代码段中那样使用它:

Class.forName("net.something.ClassA").getConstructors()[1].newInstance
    (EnumB.SUBTITLE, "Test");

修改
根据下面的评论,问题是通过反思得到一个枚举。要做的就是使用Class.getEnumConstants()。如果您知道SUBTITLES EnumB中的Class.forName("net.something.ClassA").getConstructors()[1].newInstance (Class.forName("net.something.EnumB").getEnumConstants()[4], "Test"); 位置,那么这是非常直截了当的:

Class clazz = Class.forName("net.something.EnumB");
Method nameMethod = clazz.getMethod("name");
Object value = null;
Object[] enums = clazz.getEnumConstants();

for (Object o : enums) {
    if (nameMethod.invoke(o).equals("SUBTITLE")) {
        value = o;
        break;
    }
}
Class.forName("net.something.ClassA").getConstructors()[1].newInstance
    (value, "Test");

但是你可能会怀疑,这种编码风格非常脆弱。 更好的方法是根据其名称找到它:

{{1}}

答案 1 :(得分:0)

除了Mureinik的答案,您还可以使用Enum.valueOf(Class<T> enumType, String name),因此您的代码可能看起来像(您只需要抑制一些编译器警告)

String enumName = "your.EnumName";
String valueName = "SUBTITLE";
Class<? extends Enum> enumType = (Class<? extends Enum>) Class.forName(enumName);

Enum<?> enumValue = Enum.valueOf(enumType, valueName);

现在,您应该可以在代码中使用此enumValue

Class.forName("net.something.ClassA").getConstructors()[1]
             .newInstance(enumValue, "Test");
//                        ^^^^^^^^^

请确保您传递枚举值的正确名称,否则valueOf会抛出IllegalArgumentException