ClassLoader工作機制介紹(整理版)

1、ClassLoader類結構

我們經常擴展ClassLoader以及它的重載方法:其主要方法有defineClass、findClass、loadClass、resolveClass。其中defineClass方法用來將byte字節流解析成JVM能夠識別的Class對象。findClass方法和defineClass一起使用,通過覆蓋ClassLoader父類的findClass方法來實現類的加載規則,從而取得加載類的字節碼,然後調用defineClass方法生成類的Class對象。ClassLoader是個抽象類,它還有很多子類,我們可以實現自己的ClassLoader,一般要繼承URLClassLoader這個子類,調用其相關方法。

2、ClasLoader加載機制

整個JVM平臺提供三層ClassLoader

1)、Bootstrap ClasLoader(搜索路徑 -Xbootclasspath/a:),它主要加載自身工作需要的類,僅僅是一個加載工具,沒有更高一級的父加載器,也沒有子加載器。

2)、ExtClassLoader(搜索路徑 -Djava.ext.dirs),繼承URLClassLoader,並遵守ClassLoader的加載規則。

3)、AppClassLoader(搜索路徑 -Djava.class.path=  -cp 或 -classpath),其父類是ExtClassLoader,通常在classpath目錄下加載。

JVM加載class文件到內存中有兩種方式:隱式加載、顯示加載。所謂隱式加載不通過代碼調用繼承ClassLoader,自動加載到內存中,顯示加載需要調用繼承ClassLoader類,例如:this.getclass.getClassLoader().loader()。

3、加載class文件

step 1、找到.class文件並把這個文件包含的字節碼加載到內存中。

step 2、包括三個步驟,分別是字節碼驗證、Class類數據結構分析及相應的內存分配和最後的符號表的鏈接。

step 3、類中靜態屬性和初始化賦值,以及靜態快的執行等。

4、常見加載錯誤分析(介紹兩例)

1)、ClassNotFoundException異常是java初學者經常遇到的,異常原因是加載不到類,就是JVM要加載指定文件的字節碼到內存時,並沒有找到這個文件對應的字節碼,也就是這個文件並不存在。解決辦法就是檢查當前的classpath目錄下有沒有制定的文件存在。如果不知道當前的classpath路徑,就可以通過如下命令來獲取:

this.getClass().getClassLoader().getResource("").toString()

2)、NoClassDefFoundError,這個異常在第一次使用命令執行java類時很可能碰到,如下java -cp example.jar Example。在這個jar包裏面只有一個類,這個類是com.cn.Example,正確的寫法是這樣的:java -cp example.jar com.cn.Example。


發佈了47 篇原創文章 · 獲贊 95 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章