2012-01-28 59 views
0

我試圖做一個函數,使用擴展Foo的許多類中的一個,並在其類中返回該對象的新實例,而不是新實例Foo基於參數的類的新實例

我確定這是一個常見問題。那裏有沒有好的例子?

我從來沒有使用過一個類作爲輸入參數,只有一個類的成員。根據我搜索的內容,這應該可以做到嗎?

回答

1

你是通過一個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(...)方法。

+0

謝謝隊友。似乎現在正在工作。對於其他閱讀,在此之後,我得到了一個例外,並與此線程解決:http://stackoverflow.com/questions/2120699/newinstance-failed-no-init – SpiRail 2012-01-28 15:02:27

0

您可以在這裏使用Java的反射。

如果你想只是它的類名獲得Class,您使用Class.forName

Class type = Class.forName('package.SomeClass'); 

您可以檢查這個類是Foo或它的子類:

boolean isFoo = type.isAssignableFrom(Foo.class); 

你可以那麼很容易創建一個新的實例(假設構造函數不帶參數):

Object instance = type.newInstance(); 
1

你的函數可以是這樣的

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{ 
} 

希望這有助於。