2013-06-30 32 views
4

我正在嘗試使用自定義邏輯加載單個類(即,我想用自定義版本替換我的庫中類的實現)。在Java中修改默認類加載器的行爲

我想創建自己的自定義類加載器,它代理默認的類加載器。 但是,看起來我的默認類加載器:sun.misc.Launcher.AppClassLoader不可見 - 這意味着我無法擴展它。

用於創建單個類加載器的任何解決方案都非常值得讚賞,該解決方案足夠強大以複製現有類加載器的行爲,同時在一個特定類中進行子類化。

請注意,我用

Thread current = Thread.currentThread(); 
current.setContextClassLoader(newOne); 

然而,這似乎不工作嘗試,即在線程加載的類不總是觸發我定製的ClassLoader。


背景

我希望「新LibraryClass()」的調用來使用這個類的自定義實現 - 在「新...」調用是在一個jar文件這不是我的控制之下。

+1

怎麼樣使用'URLClassLoader'?您可以在其餘的前面添加修改過的'LibraryClass'版本,以便類加載器首先找到它。或者也許重寫'findClass'。 –

回答

0

所以,我想你想用你的自定義版本替換LibraryClass使用相同的完全限定的名稱,對吧?

如果原始文件LibraryClass已經在類路徑中,則由於類加載器層次結構(請參閱The Java Class Loading Mechanism),無法使用自定義類加載器執行此操作。

一種可能的解決方法是將jar包含在您的自定義文件LibraryClass的一開始的類路徑中。然後,您的自定義類將被加載爲原始類。

如果LibraryClass是引導程序或擴展類,這將不起作用。