我有一個關於從作爲方法參數傳遞的一類在Java中實例化一個新的對象的查詢,例如:實例化一個類,在java中傳遞?
void myMethod(Class aReceived){
object = new aReceived // object will be a superclass of aReceived
}
我看到這個用客觀-C做的幾行,但我不確定它在java中如何工作。
你能幫忙嗎?
在此先感謝;)
我有一個關於從作爲方法參數傳遞的一類在Java中實例化一個新的對象的查詢,例如:實例化一個類,在java中傳遞?
void myMethod(Class aReceived){
object = new aReceived // object will be a superclass of aReceived
}
我看到這個用客觀-C做的幾行,但我不確定它在java中如何工作。
你能幫忙嗎?
在此先感謝;)
如果你想通過無參數的構造函數來創建一個對象:
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));
Class
有一個方法就可以了叫newInstance
用於創建類的實例。你也可以看看整個java.lang.reflect
package。
object = aReceived.newInstance();
這假定該類有一個無參數構造函數。
如果你只有一個默認的構造函數,你可以做這樣的事情:
aReceived.newInstance();
如果你需要傳遞參數,你不能使用此方法。但是,您可以在確定哪一個是正確的構造函數的情況下進行管理,例如getConstructor(Class<?> parameterTypes ...)
如果你想傳遞一個字符串作爲唯一參數,你可以這樣做:
Constructor ctor = aReceived.getConstructor(String.class);
object = ctor.newInstance("somestring");
我已經使用了aReceived.newInstance();最初我收到了這樣的錯誤:未報告的異常java.lang.InstantiationException;必須被捕獲或宣佈被拋出。我通過在myMethod聲明末尾添加'throws Exception'來解決這個問題,該問題似乎已經清理完畢。然而,我現在無法調用該方法:嘗試使用myMethod(testClass); testClass是我在代碼中定義的一個。有任何想法嗎?再次感謝您的幫助;) – eJm 2011-12-16 19:13:25
在下面的答案中增加了另一節來解決您所描述的問題。 – 2011-12-16 23:35:07