2011-06-24 58 views
0

我有一個String數組,對應於我的一個包中的Classes名稱。例如,可以說我有一個ArrayList,其中包含三個項目:「A1」,「A2」,「A3」。創建類<?>對象其中<?>被定義爲ArrayList中的字符串<String> - Java

我想創建使用代碼這些類如實例:

Class<?> objectToCreate = (Class<?>) MyStaticClass.class.getClassLoader().loadClass(objectToCreate); 
    <?> objectCreated = objectToCreate.newInstance(); 

這樣,通過上面的代碼行循環後,我將具有A1類的一個實例的一個實例一個A2類和一個A3類的一個實例。

有誰知道這是否可能?我意識到這是「讓我Google爲你」的領土,但我正在努力想到名詞來查詢這將給我答案!

+0

大約18個月後,我對此進行了重新審視。我現在看到,我的問題忽略了一個泛型集合包含「like」類型的基本性。在這種情況下,類型可能是一個不起眼的String,並且在答案中使用@ alphazero的建議,這可能會用於生成返回爲String類型的實例。不過謝謝你,並且對於正確方向的引導來說也是如此。 – 8bitjunkie

回答

1

您需要將?設置爲通配符以外的其他名稱,這意味着它必須在某處定義。你的選擇在方法或類上。我想到的方法都可以工作,所以嘗試的方法包裝這一點,就像這樣:

public <T> T create(String name) { 
    Class<T> objectToCreate = (Class<T>) MyStaticClass.class.getClassLoader().loadClass(objectToCreate); 
    T objectCreated = objectToCreate.newInstance(); 
    return objectCreated; 
} 
+0

這就是我的問題,sblundy。我需要「T」與來自StringArray的字符串相同。無論如何Cast到一個字符串的值? – 8bitjunkie

+0

@ 7SpecialGems:是的,在某個時刻必須有演員陣容。你看,字符串沒有與之相關的類型,至少從編譯器的角度來看並不是。字符串只是一個字符串。 – sblundy

+0

也許我已經給了一個不好的例子 - 我會嘗試另一個:class clazz = Class.forName(objectToCreate); Object obj = clazz.newInstance(); System.out.println(「Type:」+ obj.getClass()。getName());給我的類的類型。然而,爲了編譯器的好處,我需要從Object向下轉換爲此值,以便我可以調用obj特定的方法,而不是Object中的方法,例如obj.someSpecificMethod()。 – 8bitjunkie

1

可以使用

Class<?> clazz = Class.forName(classname); 

你當然可以使用newInstance()如果你的類提供一個公共的無簡單地獲取類-arg構造函數。或者,您可以獲取所有可用的構造函數,並使用適當的參數調用ctor。

+0

Class clazz = Class足夠快樂。forName(className)和Object obj = clazz.newInstance(),但是有沒有什麼方法可以從Object向下轉換爲與字符串「className」相同名稱的對象類型? – 8bitjunkie

+0

這不是魔術,對吧? (正如你在sblundy的conv所注意到的那樣)在編譯時沒有足夠的信息來確定'T'。如果你真的沒有超出類名的信息,那麼你需要用一些字節代碼工程來弄髒你的手,或者在運行時動態編譯和創建工廠(在你編譯的代碼中正確的強制轉換等等) – alphazero

相關問題