2011-12-16 30 views
1

我有一個關於從作爲方法參數傳遞的一類在Java中實例化一個新的對象的查詢,例如:實例化一個類,在java中傳遞?

void myMethod(Class aReceived){ 
    object = new aReceived  // object will be a superclass of aReceived 
} 

我看到這個用客觀-C做的幾行,但我不確定它在java中如何工作。

你能幫忙嗎?

在此先感謝;)

+0

我已經使用了aReceived.newInstance();最初我收到了這樣的錯誤:未報告的異常java.lang.InstantiationException;必須被捕獲或宣佈被拋出。我通過在myMethod聲明末尾添加'throws Exception'來解決這個問題,該問題似乎已經清理完畢。然而,我現在無法調用該方法:嘗試使用myMethod(testClass); testClass是我在代碼中定義的一個。有任何想法嗎?再次感謝您的幫助;) – eJm 2011-12-16 19:13:25

+0

在下面的答案中增加了另一節來解決您所描述的問題。 – 2011-12-16 23:35:07

回答

5

如果你想通過無參數的構造函數來創建一個對象:

void myMethod(Class<?> aReceived) { 
    Object newObject = aReceived.newInstance(); 
    ... 
} 

如果你想創建通過兩個參數的構造函數的對象(以字符串,INT):

void myMethod(Class<?> aReceived) { 
    Object newObject = aReceived.getConstructor(String.class, int.class) 
     .newInstance("aaa", 222); 
    ... 
} 

最後,可以使用泛型適當地設定newObject變量(的類型上的任一上述片段的)頂部:

void myMethod(Class<T> aReceived) { 
    T newObject = aReceived.getConstructor(String.class, int.class) 
     .newInstance("aaa", 222); 
    ... 
    // Sadly, due to erasure of generics you cannot do newObject.SomeMethodOfT() 
    // because T is effectively erased to Object. You can only invoke the 
    // methods of Object and/or use refelection to dynamically manipulate newObject 
} 

[附錄]

你怎麼稱呼這種方法嗎?

選項1 - 當你知道,在代碼編寫的時候,你想傳遞給方法是什麼類:

myMethod(TestClass.class) 

選項2 - 當被實例化的類的名字只能根據已知情況運行時,作爲一個字符串:

String className = ....; // Name of class to be instantiated 
myMethod(Class.forName(className)); 
3
object = aReceived.newInstance(); 

這假定該類有一個無參數構造函數。

1

如果你只有一個默認的構造函數,你可以做這樣的事情:

aReceived.newInstance(); 

如果你需要傳遞參數,你不能使用此方法。但是,您可以在確定哪一個是正確的構造函數的情況下進行管理,例如getConstructor(Class<?> parameterTypes ...)

如果你想傳遞一個字符串作爲唯一參數,你可以這樣做:

Constructor ctor = aReceived.getConstructor(String.class); 
object = ctor.newInstance("somestring");