我試圖做一個函數,使用擴展Foo
的許多類中的一個,並在其類中返回該對象的新實例,而不是新實例Foo
。基於參數的類的新實例
我確定這是一個常見問題。那裏有沒有好的例子?
我從來沒有使用過一個類作爲輸入參數,只有一個類的成員。根據我搜索的內容,這應該可以做到嗎?
我試圖做一個函數,使用擴展Foo
的許多類中的一個,並在其類中返回該對象的新實例,而不是新實例Foo
。基於參數的類的新實例
我確定這是一個常見問題。那裏有沒有好的例子?
我從來沒有使用過一個類作爲輸入參數,只有一個類的成員。根據我搜索的內容,這應該可以做到嗎?
你是通過一個Class
對象作爲參數,還是在Foo
的子類的實例?
無論哪種情況,解決方案都幾乎相同,您可以在Class對象上使用newInstance方法。
/**
* Return a new subclass of the Foo class.
*/
public Foo fooFactory(Class<? extends Foo> c)
{
Foo instance = null;
try {
instance = c.newInstance();
}
catch (InstantiationException e) {
// ...
}
catch (IllegalAccessException e) {
// ...
}
return instance; // which might be null if exception occurred,
// or you might want to throw your own exception
}
如果您需要構造ARGS可以使用getConstructor類的方法,並從那裏的構造newInstance(...)方法。
您可以在這裏使用Java的反射。
如果你想只是它的類名獲得Class
,您使用Class.forName
:
Class type = Class.forName('package.SomeClass');
您可以檢查這個類是Foo
或它的子類:
boolean isFoo = type.isAssignableFrom(Foo.class);
你可以那麼很容易創建一個新的實例(假設構造函數不帶參數):
Object instance = type.newInstance();
你的函數可以是這樣的
public class NewInstanceTest {
public static Object getNewInstance(Foo fooObject){
java.lang.Class fooObjectClass = fooObject.getClass();
try {
return fooObjectClass.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
return null;
} catch (IllegalAccessException e) {
e.printStackTrace();
return null;
}
}
public static void main(java.lang.String[] args){
// This prints Foo
java.lang.System.out.println(getNewInstance(new Foo()).getClass().getName());
// This prints Foo1
java.lang.System.out.println(getNewInstance(new Foo1()).getClass().getName());
}
}
class Foo{
}
class Foo1 extends Foo{
}
希望這有助於。
看Abstract Factory模式。
謝謝隊友。似乎現在正在工作。對於其他閱讀,在此之後,我得到了一個例外,並與此線程解決:http://stackoverflow.com/questions/2120699/newinstance-failed-no-init – SpiRail 2012-01-28 15:02:27