類加載器分爲4種類型
加載器 | 說明 |
---|---|
Bootstrp loader | Bootstrp加載器是用C++語言寫的,它是在Java虛擬機啓動後初始化的,它主要負責加載%JAVA_HOME%/jre/lib,-Xbootclasspath參數指定的路徑以及%JAVA_HOME%/jre/classes中的類 |
ExtClassLoader | Bootstrp loader加載ExtClassLoader,並且將ExtClassLoader的父加載器設置爲Bootstrp loader.ExtClassLoader是用Java寫的,具體來說就是 sun.misc.Launcher$ExtClassLoader,ExtClassLoader主要加載%JAVA_HOME%/jre/lib/ext,此路徑下的所有classes目錄以及java.ext.dirs系統變量指定的路徑中類庫。 |
AppClassLoader | Bootstrp loader加載完ExtClassLoader後,就會加載AppClassLoader,並且將AppClassLoader的父加載器指定爲 ExtClassLoader。AppClassLoader也是用Java寫成的,它的實現類是 sun.misc.Launcher$AppClassLoader,另外我們知道ClassLoader中有個getSystemClassLoader方法,此方法返回的正是AppclassLoader.AppClassLoader主要負責加載classpath所指定的位置的類或者是jar文檔,它也是Java程序默認的類加載器。 |
用戶自定義加載器 | 加載自定義的類 |
雙親委派機制
比如當我們自定義的Class A 需要被加載的時候,
AppClassLoader
會交給父級ExtClassLoader
去加載,而ExtClassLoader
會交給父級Bootstrp loader
加載,當父級的Bootstrp loader
加載不了的話,會交給子級ExtClassLoader
加載,加載不了的話,交給子級AppClassLoader
去加載,如果還是加載不了的話,就拋出異常
注意: 父級加載器看不到子類加載器,然後子類加載器可以看到父類的加載器