据我所知,我想做的事情(标题)是不可能的。 然而,这里有3个小代码样本 - 第一个是我现在拥有的,第二个是我想要的,第三个是实现它的方法,我不想使用由于反射。我想知道是否有办法重构我的代码以接近第二个例子。 做了一些假设:这里使用的每个类只有一个构造函数,并且确切地知道它需要什么对象。 Object []是因为我在运行时不知道所有内容。
1
Object o; Object[] params; String myString;
switch(myString){
case "ClassA": o = new ClassA(params);
case "ClassB": o = new ClassB(params);
//ETC
}
2
Object o; Object[] params; String myString;
HashMap<String, Class<?>> map;
o = new map.get(myString)(params); //Obviously doesnt work
3
Object o; Object[] params; String myString;
HashMap<String, Class<?>> map;
o = map.get(myString).getConstructors()[0].newInstance(params);
请注意,我实际上是在撒谎。我现在所拥有的不是1
,而是3
。我不能拥有1
,因为我无法对所有类名进行硬编码。我想要2
。有什么建议吗?
一些澄清:
示例2
和3
中的HashMap包含类名和实际类对象的字符串表示形式。
此外,它在运行时填充(显然),这意味着我知道在执行上面的代码之前我想要实例化的所有可能的类,但是我不能对它们中的任何一个进行硬编码:它们是由文件加载的。
答案 0 :(得分:2)
我很遗憾地通知:
这在Java中是不可能的。
编写您自己的语言,不遵循二元原则,您可以使用反射实例化一个类,但不使用反射。祝你好运。