2010-09-25 162 views
3

我有一種情況,我必須加載一個命名的類。如果在我的類路徑中有多個具有相同名稱的類(例如,com.example.myclass),我必須同時加載這兩個類。我正在使用派生自java.lang.ClassLoader的CustomLoader類的'loadClass()'方法。我沒有改變父類的行爲,只是簡單地調用父類的方法。我的問題是,如果有兩個同名的類,我只能加載其中的一個。我已掃描網絡尋找解決方案,但沒有找到任何解決方案。我通過創建一個新的類加載器實例發現了許多重載類的解決方案,但在我的情況下,新實例可能會再次加載第一個類。這個問題能解決嗎?解決java中的類名衝突

編輯:我忘了提及這兩個類具有相同名稱在不同的jar文件。

編輯:無論喬恩和斯蒂芬作出了同樣的解決方案,但我只能標記一個作爲答案。對不起:(我已經投了兩個答案,但。

回答

6

相信 JVM和類庫假設一個類名是一個類加載器中是唯一的。因此,如果你想爲不同類加載相同的類名,你需要不同的類加載器(例如,一個用於每個jar文件)。

使用它們可能會非常棘手,但這是排序的問題,你有這樣的事情搞定了。

+0

我是Java新手。你能解釋一下每個jar的classloader是什麼意思嗎?我如何爲每個jar指定一個不同的類加載器? – 341008 2010-09-25 06:34:30

+1

@Rajorshi:您將不得不創建一個指出每個jar文件的(比如說)URLClassLoader的新實例,並要求每個實例加載該類。但說實話,如果你是Java新手,我會開始嘗試這種事情一段時間。我甚至建議有經驗的Java開發人員應儘可能避免陷入這種情況。 – 2010-09-25 07:13:03

+0

感謝您的提示。我不能拒絕實現這個模塊,但高級java開發人員將會檢查代碼。如果我錯過任何東西,他們應該能夠發現它。 – 341008 2010-09-25 07:43:49

4

類裝入器API也沒辦法指定

這兩個類具有相同的名稱,你的應用程序試圖加載的。

您將需要使用不同的類路徑配置兩個不同的類加載器。然後,您將需要通過在相應的類加載器上調用loadClass(String)方法來加載類。

有許多「陷阱」有做這種事情的。其中之一是各個類的實例類型將會不同,並且從一個類型到另一個類型的類型轉換將失敗。

+0

不幸的是,在運行時不能配置類路徑。 – 341008 2010-09-25 06:37:28

+3

@Rajorshi - 哦,是的,它是!請參閱http://download.oracle.com/javase/6/docs/api/java/net/URLClassLoader.html – 2010-09-25 06:39:13

0

我認爲有一些嚴重錯誤問題這裏。這種狀況怎麼可能首先出現?首先會產生重複類的開發過程存在嚴重問題。

或者是問題,這是試圖解決?還是診斷?

+0

這是一個插件框架,期望所有第三方都存在於特定的文件夾中。插件可以由任何人編寫,所以我們不能保證不會有任何衝突。 – 341008 2010-09-27 16:31:55

+1

然後,我建議你制定一條規則,使其包名中使用com.mycompany.whatever作爲推薦用於所有Java編程的規則,並且如果他們沒有遵守它,則不承擔責任。 – EJP 2010-09-28 07:54:30