類載入器(ClsaaLoader)的簡單講述
阿新 • • 發佈:2020-10-08
概述:
我們知道當我們第一次使用某一個類的時候,我們需要先將這個類編譯成位元組碼檔案,然後將這個位元組碼檔案載入到記憶體中,這個載入的過程中需要藉助類載入器進行載入進記憶體。
類載入器的分類:
- 引導類載入器
- 擴充套件類載入器
- 系統類載入器
- 自定義類載入器(不做解釋)
其中我們最常使用的就是系統類載入器,下面我們通過程式碼演示各種類載入器之間的關係:
public class ClassLoaderDemo { public static void main(String[] args) { //通過自定義類預設獲得的是系統類載入器:AppClassLoader ClassLoader classLoader = ClassLoaderDemo.class.getClassLoader(); System.out.println(classLoader); //通過系統類載入器的getParent()方法可以獲得擴充套件類載入器:ExtClassLoader ClassLoader classLoaderParent = classLoader.getParent(); System.out.println(classLoaderParent); //但是我們通過擴充套件類載入器的方法並不能獲得引導類載入器 ClassLoader classLoaderParentParent = classLoaderParent.getParent(); System.out.println(classLoaderParentParent);//獲得的將是null //引導類載入器是載入java的核心類庫檔案的,它使用c++寫的,所以我們知道String類的載入器也是引導類載入器 //但是我們通過String也並不能獲得引導類載入器 ClassLoader classLoader1 = String.class.getClassLoader(); System.out.println(classLoader1);//輸出的將是null //基本資料型別是核心類庫裡面的東西,所以基本資料型別的類載入器也是引導類載入器 ClassLoader loader = int.class.getClassLoader(); System.out.println(loader); } }
- 所以我們通過自定義類的當前執行時類(也就是本類在記憶體中對應的位元組碼亦或是對應的Class物件的引用)的getClassLoader();
方法可以獲得系統類載入器(AppClassLoader) - 可以通過系統類載入器的getParent();方法獲得擴充套件類載入器(ExtClassLoader)。
- 雖然擴充套件類載入器也可以呼叫getParent();方法,但是卻無法獲取到引導類載入器,獲取之後的輸出結果是null。
三種載入器對應的載入工作:
其實從上圖就可以看出:
- 引導類載入器主要是對java平臺的核心類庫的載入,而且它使用c++編寫的,是JVM自帶的載入器
可以把這個載入器想象成皇室成員專用的載入器(String類就是用的這個載入器) - 擴充套件類載入器負責對jre/lib/ext目錄下的jar包裝載進工作褲,對java自帶的一些jar包載入。
- 系統類載入器主要對自定義類的載入。