2013-06-27 24 views
2

有沒有辦法動態地使用類似J2ME黑莓創建實例從數組類

MyClass[].newInstance(); 

我知道,它拋出一個InstantiationException創建從Class對象的數組,但有我的方式使用Class對象實例化一個數組,指示它的類型?

+1

你能否澄清?聽起來像你想要一個數組,其中的類型可以設置/更改。我認爲這是不可能的。最近我能想到的是Object [] array = new MyClass [10];' 你也許可以使用這個想法,並創建一個類來將數組中的對象複製/轉換爲另一種類型。 – Kevin

+0

相關?:http://stackoverflow.com/q/1632130/813951 –

+1

對於第一個評論:我不知道類,(我是一個類型類的變量)。對於第二個評論:我正在使用J2ME。底線,不可能。 –

回答

0

由於java.lang.reflect.Array.newInstance()不可用J2ME,我覺得你需要一個循環來爲每個對象做到這一點:

private Object[] createArray(String fullClassName, int length) { 
    Object[] objects = new Object[length]; 
    try { 
     Class c = Class.forName(fullClassName); 
     for (int i = 0; i < objects.length; i++) { 
      objects[i] = c.newInstance(); 
     } 
    } catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IllegalAccessException e) { 
     e.printStackTrace(); 
    } catch (InstantiationException e) { 
     e.printStackTrace(); 
    } 
    return objects; 
} 

,記得完全限定域名(如果你使用字符串化類名):

Object[] array = createArray("mypackage.Widget", 10); 

package mypackage; 

public class Widget { 
    public int foo() { 
     return 5; 
    } 
} 

注意,getConstructor() methodBlackBerry Class中不可用,因此您僅限於使用無參數構造函數創建對象。

+0

使用類的字符串化名稱是解決方案。但是,只有當我使用具體類時,如果數組是抽象或接口,則無法獲取數組組件類型來實例化這些類。 –

+0

@ danielrvt-sgb,如果你不想要,你不必使用字符串名稱。在我的示例中,您可以更改'createArray()'以'Class c'作爲參數。但是,**某處**,您需要決定創建一個**具體**類。您不能實例化抽象類或接口。有些東西需要決定抽象類的哪個子類,或者將創建哪個接口的實現。 – Nate

+0

另外,請記住選擇有用的答案。像這些問題沒有得到太多關注,投票是找出可行的答案的方法。謝謝。 – Nate