2017-02-24 63 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

相關問題