最近我在一次採訪中詢問了加載類時調用類加載器的順序。人們不得不編寫自己的類加載器的原因是什麼
不幸的是,我從來沒有必要編寫自己的類加載器,所以當時不熟悉類加載的複雜性。
這讓我想知道,他們爲什麼要編寫自己的類加載器。
這就是我的問題:人們面臨哪些需要編寫自己的類加載器的需求?
最近我在一次採訪中詢問了加載類時調用類加載器的順序。人們不得不編寫自己的類加載器的原因是什麼
不幸的是,我從來沒有必要編寫自己的類加載器,所以當時不熟悉類加載的複雜性。
這讓我想知道,他們爲什麼要編寫自己的類加載器。
這就是我的問題:人們面臨哪些需要編寫自己的類加載器的需求?
典型的原因是您的應用程序正在託管其他應用程序,這些應用程序在相同的運行時(例如Tomcat)中使用不同版本的相同庫。所以你必須確保你的類加載器可以爲這些應用程序中的每一個提供相同類的不同版本。
編輯:
爲了澄清這一點(在註釋中看到混亂):當說:「你的類加載器」我沒有精神疾病的這樣一類的實例「java.lang.ClassLoader
的實現」。其實它是你的類加載器s在兩個意義上:雄貓的人實現了不同的ClassLoader
類,並在運行時有更多的實例...詳情請參閱corresponding docs。
實際上,您將不得不使用類加載器的不同實例加載同一類的不同版本。一個類加載器不能同時擁有同一個類的兩個版本... – pgras 2009-02-25 13:59:34
@pgras:我認爲這就是kai1968的含義......「你的類加載器」==「你的應用中使用的類加載器」,至少這就是我閱讀。 – 2009-02-25 14:55:18
當我想從.jar文件中加載.jar文件中的類時,我不得不實現一個類加載器(這是幾年前,我確信現在有工具可以爲您做這件事)。即,您可以將依賴項.jar文件放入一個.jar文件中。
但這是唯一的一次,以我的經驗寫一個自定義ClassLoader是一件非常罕見的事情。
看看這個question。
一些地方實際上將類存儲在數據庫中(以前曾有地方,不知道是否存在),並在運行時使用類加載器從數據庫中獲取類。
我目前正在研究一個非常大的應用程序,它是高度模塊化的,即它由幾百個JAR文件組成。這意味着類路徑字符串變成了巨大的,由於各種開發工具無法處理5KB類路徑字符串,導致各種地方出現各種各樣的問題。這是通過編寫一個從文件中讀取其類路徑的自定義類加載器來解決的。
我們有一個應用程序框架,它有基於它的'靜態綁定'的應用程序。這意味着你需要爲每個應用程序運行一個jvm實例,這不僅對內存使用不利,而且意味着你不可能有一個超級應用程序來啓動各種應用程序,進程間)正在運行的應用程序之間的通信。
由於整個事情是從webstart運行的(即有一堆jar作爲classpath),防止系統類加載器找到類的解決方案是抵消軟件包。對於expample,如果您在應用程序foo中有類a.b.X
,那麼它將在jar文件中爲foo/a/b/X.class
。
無聊和想要折磨我的同事,當他們必須維護我的代碼。 :)
在我上一份工作中,我們實現了一個可能具有「插件邏輯查詢定義」的服務器。 (客戶端可以通過名稱調用查詢,服務器查找該名稱的註冊查詢並運行它)。
查詢定義是包含在jar中的代碼和/或元數據。
該jar通過我們的控制檯應用程序上傳到服務器。
上傳時(以及稍後當服務器重新啓動時),我們的框架將爲該jar創建一個類加載器,以將其加載到正在運行的服務器中。
我遇到了一個article,它講述了爲什麼(很簡單)OSGI使用自定義Classloader。
我已經這樣做了一次。我們必須使用由第三方供應商提供的API,並且此API使用奇怪的hibernate3.jar版本。 所以,我們不得不加載這個特定的jar與自定義類加載器,以避免「序列版本UID」異常。
我看過一篇好帖子here。它討論了不同的類加載器,類加載器層次結構和自定義類加載器。
您可以在沒有停機的情況下進行軟件發佈,這種情況在全天候運行的系統中也是如此。
您可以編寫自己的JMX類加載器調用,並在運行時替換類文件。
用非常簡單的話來說,JRE自帶的默認類加載器可以從類路徑(文件系統),URL(例如Applet類加載器,RMI類加載器等套接字)加載類。如果這些不夠或不加載正確的類(例如需要加載同一類的不同版本),您需要編寫自己的自定義類加載器。 – 2013-07-20 17:29:10