據我所知,我想要做的事(標題)是不可能的。 但是,這裏有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
對類名的字符串表示,和實際的類的對象。 (很明顯),這意味着我知道在執行上面的代碼之前我想要實例化的所有可能的類,但是我無法對它們中的任何一個進行硬編碼:它們由文件加載。
爲什麼你想要它? map中有什麼? –
使用反射實例化,但沒有反射使用是複雜的。 – davidxxx
如果你不能硬編碼所有的類名,你也不能有'2'或所有的字符串從哪裏來?還是這是一個誤解,你至少知道代碼中的某一點可能使用了所有類(ClassA,ClassB ...)? –