我尝试在反射中制作这一行,但未能制作EnumTitleAction.SUBTITLE
:
new ClassA(EnumB.SUBTITLE, "Test");
如何做到这一点?
我已经尝试这样做:
Class.forName("net.something.ClassA").getConstructors()[1].newInstance(/*Stuck with EnumB*/, "Test");
但我不知道如何用反射来表示 EnumB 部分。
最佳答案
枚举值是对象 - 只需像在第一个代码段中那样使用它即可:
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");
关于java - 枚举反射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27201802/