2017-02-24 64 views
0

据我所知,我想要做的事(标题)是不可能的。 但是,这里有3个小样本的代码 - 第一个是我现在所拥有的,第二个是我想要的,第三个是实现它的一种方法,我不想使用到期的反思。我想知道是否有办法重构我的代码以接近第二个示例。 有几个假设:在这里使用的每个类只有一个构造函数,并且确切知道它需要什么对象。对象[]是因为我不知道在运行时的一切。实例化类对象而不使用反射

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。有什么建议么?

一些澄清:

HashMap的例子中和2包含3对类名的字符串表示,和实际的类的对象。 (很明显),这意味着我知道在执行上面的代码之前我想要实例化的所有可能的类,但是我无法对它们中的任何一个进行硬编码:它们由文件加载。

+0

为什么你想要它? map中有什么? –

+3

使用反射实例化,但没有反射使用是复杂的。 – davidxxx

+0

如果你不能硬编码所有的类名,你也不能有'2'或所有的字符串从哪里来?还是这是一个误解,你至少知道代码中的某一点可能使用了所有类(ClassA,ClassB ...)? –

回答

2

很抱歉,通知:
在Java中是不可能的。

编写自己的语言,不遵循二元的原则,在那里你可以通过反射实例化一个类,但不使用反射。祝你好运。

+0

那么,措辞只是为了说明我的问题。真正的问题是我如何能够并且应该重构我的代码,以避免反射,同时允许模块加载实体。 – user2065501

+0

我敢打赌,这是不可能的。你可以编写你自己的工具,并在中央Maven仓库中放置它(隐藏它)。 –

+0

我实际上认为我可能已经找到了一种重构我的代码的可能方式,考虑到了上面的所有注释:在HashMap中,我存储了一个实体的字符串名称和一个“EntityFactory”,它是一个类返回该特定实体的新实例。因此,添加新的实体就像调用我的“注册”方法一样简单:''''''''''''''因此,当我需要一个具有名称的实例时,我可以简单地:'map.get(name).create(params)':)! – user2065501