2013-11-01 159 views
1

對於許多框架開發,我們需要通過從配置文件讀取限定類名來實例化類。實例化一個沒有默認構造函數的類

有不同的內省策略,專門的圖書館(如Objenesis)面向它。

但是,對於沒有默認構造函數的類(重載),如果我們不知道重載構造函數的簽名,我認爲沒有內省函數。非標準方法是使用sun.misc.Unsafe類來分配。這是我的理解。這是一個正確的理解?

然後有一個問題,因爲超級類沒有通過使用不安全實例化。但我認爲不安全是最接近C代碼的「新」操作符調用的,至少是其中的一部分。

所以問題是,我們是否有Java方法通過某種形式的內省來實例化一個對象,當我們唯一的信息是該類的限定名稱(當然這存在於某個地方在類路徑!)

+2

您可以隨時檢查可用的構造函數並查看是否有任何值可以傳遞給它們。依賴注入框架將爲自動裝配構造函數注入的對象執行此操作 - 假設您正在創建的對象大多需要來自代碼庫的其他對象,而不是像字符串這樣的「通用」參數;並且DI容器也管理這些依賴關係,從而知道如何創建它們。 – millimoose

+0

你想獲得初始化對象(調用構造函數)還是未初始化的對象(沒有調用構造函數和初始化方法,字段有默認值(0或null)? –

+0

我想讓超類成員以相同的方式初始化。在堆上對象的「分配」和其成員的實例化(反過來可能需要分配)是不同策略的一部分?@millimoose你所說的對於DI框架是正確的,因爲正如你所說「它是大多數是來自你的代碼庫的對象「。但是,我嘗試了一個通用的」對象生成器「,用於一個需要外部適配器類並且不想限制爲需要擁有一個默認構造器的項目定義 –

回答

0

我不知道如果我理解你的問題,但通常在Java中,如果你知道類名稱,你可以簡單地寫: classname myObject = new classname();

+1

這個問題與運行時相關 - 在編譯時他不知道類型,所以不能寫這個,他只有字符串,包含類名。 – msangel

0

如果你有一個是類名,你可以使用Class.newInstance(),但如果它沒有默認的構造函數,你可以使用Unsafe.allocateInstance()。

您可以使用反射來查找要調用的構造函數,但您不知道要傳遞哪個或哪些參​​數。

相關問題