2017-02-10 44 views
0

正如我所提到的,我在不同的罐子裏有兩個具有相同名稱和相同包裝結構的類。 可以說
jar1我的課是a.b.c.ClassName
jar2我的課是a.b.c.ClassName
我有不同的類構造函數來區分。我在不同的罐子裏有兩個具有相同名稱和相同包裝結構的類。專門從jar中選擇一個類是否可行?

我的問題是,是否有可能基於構造函數創建對象。 例,

if(condition){ 
a.b.c.ClassName obj = new a.b.c.ClassName(Param); 
} 
else{ 
a.b.c.ClassName obj = new a.b.c.ClassName(Param, AnotherParam); 
} 

感謝,

+1

多年來,我一直在做幾個項目,這些項目在不同的罐子裏有着相同的類包/名稱,並且它只造成了麻煩。我認爲這是一個存在雙重類的錯誤,儘管java有它的先決條件,但我不知道項目的歷史,但我建議儘可能解決這個問題。咆哮:) – slipperyseal

+0

首先,你是如何編譯這個的? – hunter

+1

您有一個主要的設計錯誤。修理它。 – EJP

回答

2

我的問題是,是否有可能基於構造函數創建對象。

我想問你是否Java會根據哪個版本的類具有與給定簽名相匹配的構造函數來從哪個jar中加載該類。不,它不會。 Java將按順序在類路徑中的目錄和jar中查找指定的類,並將使用它找到的第一個類。

可以想象,您可以編寫一個自定義ClassLoader,它可以幫助您根據可用構造函數的簽名來選擇要加載的類的哪個版本,但是這些功能不會自動觸發,因爲您似乎需要。 Java在它考慮哪些構造函數可用之前加載該類。您需要手動加載該類,並可能反射性地實例化它。你的問題不會在那裏結束。所有這些幾乎肯定比它的價值更麻煩。

如何寫一個子類而不是相同類的不同版本?

+0

其實我正在與hadoop合作。 hadoop-1.2.1-core.jar中有一個類org.apache.hadoop.mapreduce.TaskAttemptContext和hadoop 2中的類似jar。 現在我想創建基於我想要使用的hadoop版本的對象。 無論如何感謝您的可能解決方案。 – Ran

+0

@ user3655191,您使用代碼的* context *與答案無關。如果你的意思是你問的是某種非Java語言的代碼,那麼你應該用適當的語言標籤而不是用[java]來標記你的問題。 –

+0

在同一個類加載器中使用同一個庫的兩個版本可能最終導致後續問題由相同的「發現頭等」問題引起。使用多個類加載器可能是解決它的唯一實用方法。或堅持一個版本。 – slipperyseal

-1

更改您的pom中依賴項的順序。先導入您想要的罐子。

+0

這不能根據構造函數來選擇使用哪一個, – stenix

相關問題