使用URLClassLoader報錯not class found exception

熊大_wu發表於2019-03-10

使用ClassLoader時需要了解ClassLoader的雙親委任模型,不同型別的classloader及載入順序為:

1. bootstraploader:

bootstrap載入器,是c++編寫的,在java虛擬機器啟動後初始化,用於載入%java_home%/jre/lib及%java_home%/jre/classes指定的類。

 

2.ExtClassLoader

是由java程式碼編寫的,由bootstraploader載入並在載入時將其父載入器設定為bootstraClassloader。主要用於載入%JAVA_HOME%/jre/ext路徑下的所有classes目錄一級java.ext.dirs系統變數指定的路徑中的類庫。

 

3.AppClassloader:

是由java程式碼編寫的,由ExtClassLoader進行載入並將其父載入器設定為ExtClassLoader。classloader的getSystemClassLoader方法獲得的就是改載入器。改載入器主要用於載入classpath指定路徑下的jar或者class類。這也是java程式預設的類載入器。

 

雙親委派模型

每個類載入器都有自己的載入快取,當一個類被載入後會將該類放入快取,下載載入時直接返回該類。雙親委派模型載入類時主要執行以下幾個步驟:

1.classloader首先從自己載入的類中查詢該類是否已經載入,若查詢到該類則直接返回

2.若classloader沒有查詢到要載入的類,則classloader會將該類傳遞給父級classloader,委託父級載入器載入該類,父級classloader在自己的快取中查詢該類,若找到則返回該類,否則再委託自己的父級載入器。以此類推直至找到該類或到bootstrapclassolader。

3.若上述過程沒有查詢到需要載入的類,再由classloader自身進行該類的載入並放入載入快取。

 

為什麼要使用雙親委派模型

1.名稱空間

在java虛擬機器中,已classloader加類的全限定名來作為類在JVM中的唯一標識。

雙親委派模型保證了classloader之間的互動性,上級類載入器載入的類在所有子級類載入器中是共享的。

 

問題分析及解決

上述問題產生的背景是使用classloader動態載入jar及class,在載入jar時使用的是Appclassloader,而載入class時使用的是通過Thread.currentTread.contextClassLoader獲取的普通類載入器。導致載入的jar及class不在同一上下文中。從而出現CNF錯誤。

所以在使用classloader載入jar或類時,出現上述問題需要注意使用的classloader的上下文是否相同

 

關於雙親委派模型的概念摘自https://blog.csdn.net/wangyang1354/article/details/49448007/

java新手,僅以此文做問題記錄,同時希望能夠幫到有需要的朋友,文中若描述有誤歡迎斧正

相關文章