類加載器的作用
- 負責將類加載到JVM中
- 審查每個類應該由誰來加載
- 將Class字節碼重解析爲JVM要求的統一格式
類加載器的加載機制
等級加載機制
某個類加載器加載類時,會首先檢查這個類是否已經由自己加載過,如果沒有,那麼會向上一級父類加載器詢問這個類是否應該由上一級的類加載器加載,上一級類加載器根據自己的加載規則判斷後將加載結果反饋給下一級,如果也沒有進行加載,則詢問再上一級類加載器,整個過程指導有一級類加載器能夠加載這個類,或者確認這個類不能由自己加載,如果類加載器最終得到上級加載器的確認結果是這個類沒有被加載,則當前類加載器會加載這個類。
類加載器類型
JVM平臺提供層ClassLoader,這三層ClassLoader可以分爲兩種類型:
1. Bootstrap ClassLoader,這個類加載器負責加載JVM自身工作需要的類。這個ClassLoader完全由JVM自身控制,別人訪問不了這個類,它僅僅是一個類的加載工具,沒有父加載器,也沒有子加載器。
2. ExtClassLoader,這個類加載器是JVM自身的一部分,但不是JVM親自實現的,它加載的類既不是JVM內部的類,也和普通的外部類不同,它加載的類都位於System.getProperty(“java.ext.dirs”)目錄下。這個類加載器也沒有父類。
3. AppClassLoader,這個類加載器加載普通類,它的父類是ExtClassLoader,所有在System.getProperty(“java.class.path”)目錄下的類都可以被這個類加載器加載。
4. 應用自己實現的類加載器,無論直接實現抽象類ClassLoader,還是繼承URLClassLoader類,它的父加載器都是AppClassLoader,自己實現的類加載器最終都要調用ClassLoader.getSystemClassLoader()方法,這個方法返回的就是AppClassLoader。
ExtClassLoader和AppClassLoader都位於sun.misc.Launcher類中,是它的內部類。它們都繼承自URLClassLoader。
類加載器加載類的過程
JVM加載class文件到內存有兩種方式:
* 隱式加載,不通過在代碼裏調用ClassLoader來加載需要的類,而是通過JVM來自動加載需要的類到內存中。
* 顯示加載,代碼中顯式調用ClassLoader類來加載。
加載過程如下:
加載過程
鏈接過程
加載字節碼到內存,這個過程需要findClass方法來實現。對於URLClassLoader來說,其構造方法中包含一個URL[]數組,用於指定類文件所在的位置,它會被初始化爲URLClassPath類用於後面查找類文件。
設置ClassLoader的搜索路徑
ClassLoader類型 | 參數選項 | 說明 |
---|---|---|
Bootstrap ClassLoader | -Xbootclasspath: | 設置Bootstrap ClassLoader的搜索路徑 |
ExtClassLoader | -Djava.ext.dirs | 設置Ext ClassLoader的搜索路徑 |
AppClassLoader | -Djava.class.path或者-cp或者-classpath | 設置AppClassLoader的類搜索路徑 |
ClassLoader類
介紹
各種類加載器的抽象父類,一般我們實現自己的類加載器時通常繼承它的子類URLClassLoader,這個子類實現了大部分抽象方法。
它的方法
- Class