2011-01-14 83 views
5

我想知道是否有可能在Java中聲明某個給定類型的新對象,因爲我已將該類型表示爲Class對象。聲明Java對象的類型/類名爲字符串

例如,讓我們說,我有

SomeClass obj1; 
Class c = obj1.getClass(); 

現在我想借「C」,並用它來聲明該類型的新對象。沿着這些方向的東西:

Class<c> my_new_var; 

這樣my_new_var將會是一個與obj1相同類型/類的變量。這與我們是否可以在新變量的聲明中使用類對象(或與該對象相關的東西)作爲類型直接相關。

這是可能的,或者不可能的,因爲Java是強類型的?

由於提前,

布魯諾

+0

這種動態弄虛作假甚至動態語言的阻礙。你爲什麼認爲這是一個好主意? – delnan 2011-01-14 18:45:55

回答

2
YourType newObject = c.newInstance(); 

但是,你需要有一個無參數的構造函數。否則,你不得不做更多的思考。

請注意,如果參數化了Class,則不需要投射。如果不是,就像你的代碼一樣,你需要一個強制轉換。

第二個問題 - 不,不可能聲明動態類型的變量,因爲是的,java是靜態類型的。您必須在編譯時定義一個變量的類型。在上面的例子中你可以:

  • 使用Object,如果你不知道類型,因爲它是所有對象的超類。
  • 使用泛型。例如(具有異常處理中省略):

    public static <T> T createNewInstance(T exampleInstance) { 
        return (T) exampleInstance.getClass().newInstance(); 
    } 
    
+2

假設你的類有一個公共的無參數構造函數。 – biziclop 2011-01-14 18:44:05

+0

感謝Bozho。我明白c.newInstance()會給我一個與obj1相同類型的新對象;問題是,當聲明newObject時,我仍然需要聲明它爲「YourType」,我假設除了通過「c」之外我不知道它。理想情況下,我會發現像類可以用作一個類型時聲明一個新的變量 - 這樣我可以做類 newObject = c.newInstance(),但我明白,這可能是不可能的,因爲Java靜態類型。我對嗎?再次感謝! – Bruno 2011-01-15 01:56:09

0

像這樣:

Class c = Class.forName("com.xyzws.SomeClass"); 
Object a = c.newInstance(); 
1

如果你有一個默認的構造函數:

SomeClass obj2 = (SomeClass) c.newInstance(); 
0

my_new_varClass<SomeClass>類型,這是不一樣的obj1這是SomeClass型的。

但是my_new_var.newInstance()確實會爲您提供與obj1相同類型的新對象。

0

嗯,你可以這樣做:

SomeClass obj1 = ... 
Class<? extends SomeClass> c = obj1.getClass(); 
SomeClass obj2 = c.newInstance(); 

這需要SomeClassobj1實際上是任何一個子類無參數的構造函數(如果有的話)。

但是,這僅適用於您所知道的Class對象的類型。給定一些任意的原始ClassClass<?>對象,您不知道什麼類型的對象newInstance()會返回,您只能將該實例聲明爲Object

0

對於我這種工作:

Object innerObj = classObj.getClass().newInstance();