類加載器 | 加載路徑 | 描述 |
---|---|---|
啓動類加載器(Bootstrap) | <Java_Runtime_Home>/lib下面的核心類庫或-Xbootclasspath選項指定的jar包加載到內存中java |
引導類裝入器是用本地代碼實現的類裝入器 因爲引導類加載器涉及到虛擬機本地實現細節,開發者沒法直接獲取到啓動類加載器的引用,因此不容許直接經過引用進行操做。 |
擴展類加載器(Extension) | < Java_Runtime_Home >/lib/ext或者由系統變量-Djava.ext.dir指定位置中的類庫加載到內存中 | 擴展類加載器是由Sun的ExtClassLoader(sun.misc.Launcher$ExtClassLoader)實現的 開發者能夠直接使用標準擴展類加載器。 |
系統類加載器(System) | 系統類路徑java -classpath或-Djava.class.path變量所指的目錄下的類庫加載到內存中 | 系統類加載器是由 Sun的 AppClassLoader(sun.misc.Launcher$AppClassLoader)實現的,開發者能夠直接使用系統類加載器 |
JVM在加載類時默認採用的是雙親委派機制。通俗的講,就是某個特定的類加載器在接到加載類的請求時,首先將加載任務委託給父類加載器,依次遞歸,若是父類加載器能夠完成類加載任務,就成功返回;只有父類加載器沒法完成此加載任務時,才本身去加載spa
自定義類加載器沒有指定父類加載器的狀況下,默認的父類加載器即爲系統類加載器。同時,咱們能夠得出以下結論:即便用戶自定義類加載器不指定父類加載器,那麼,一樣能夠加載以下三個地方的類:
1. <Java_Runtime_Home>/lib下的類;
2. < Java_Runtime_Home >/lib/ext下或者由系統變量java.ext.dir指定位置中的類;
3. 當前工程類路徑下或者由系統變量java.class.path指定位置中的類。.net
線程上下文類加載器(context class loader)是從 JDK 1.2 開始引入的。類 java.lang.Thread中的方法 getContextClassLoader()和 setContextClassLoader(ClassLoader cl)用來獲取和設置線程的上下文類加載器。若是沒有經過 setContextClassLoader(ClassLoader cl)方法進行設置的話,線程將繼承其父線程的上下文類加載器。Java 應用運行的初始線程的上下文類加載器是系統類加載器。在線程中運行的代碼能夠經過此類加載器來加載類和資源。 使用線程上下文類加載器,能夠在執行線程中拋棄雙親委派加載鏈模式,使用線程上下文裏的類加載器加載類線程