我尝试在反射中创建此行但未能生成EnumTitleAction.SUBTITLE
:
new ClassA(EnumB.SUBTITLE, "Test");
怎么做?
我已经尝试过这样做了:
Class.forName("net.something.ClassA").getConstructors()[1].newInstance(/*Stuck with EnumB*/, "Test");
但是我无法找到如何用反射来表示EnumB部分。
答案 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
。