java classloader

在 Java 中,全部的類默認經過 ClassLoader 加載,而 Java 默認提供了三層的 ClassLoader,並經過雙親委託模型的原則進行加載,其基本模型與加載位置以下線程

 

 

Java 中默認的 ClassLoader 都規定了其指定的加載目錄,通常也不會經過 JVM 參數來使其加載自定義的目錄,因此咱們須要自定義一個 ClassLoader 來加載裝有不一樣版本的 jar 包的擴展目錄,同時爲了使運行擴展的 jar 包時,與啓動項目實現絕對的隔離,咱們須要保證他們所加載的類不會有相同的 ClassLoader,根據雙親委託模型的原理可知,咱們必須使自定義的 ClassLoader 的 parent 爲 null,這樣無論是 JRE 自帶的 jar 包或一些基礎的 Class 都不會委託給 App ClassLoader(固然僅僅是將 Parent 設置爲 null 是不夠的,後面會說明)。與此同時這些實現了不一樣版本的 jar 包,是通過二次開發後的能夠獨立運行的項目。blog

 

總的來講,實現隔離容許指定 jar 包,主要須要作到如下幾點:開發

自定義 ClassLoader,使其 Parent = null,避免其使用系統自帶的 ClassLoader 加載 Class。
在調用相應版本的方法前,更改當前線程的 ContextClassLoader,避免擴展包的依賴包經過Thread.currentThread().getContextClassLoader()獲取到非自定義的 ClassLoader 進行類加載
經過反射獲取 Method 時,若是參數爲自定義的類型,必定要使用自定義的 ClassLoader 加載參數獲取 Class,而後在獲取 Method,同時參數也必須轉化爲使用自定義的 ClassLoade 加載的類型(不一樣 ClassLoader 加載的同一個類不相等)get

相關文章
相關標籤/搜索