Java高階篇——深入淺出Java類載入機制
類載入器
簡單講,類載入器ClassLoader的功能就是負責將class檔案載入到jvm記憶體。
類載入器分類
從虛擬機器層面講分為兩大型別的類載入器,一是Bootstrap Classloader即啟動類載入器(C++實現),它是虛擬機器的一部分,二是其他型別類載入器(JAVA實現),在虛擬機器外部,並全部繼承ClassLoader類。
從細分的角度講會分為以下三類類載入器:
1、Bootsrap ClassLoader
啟動類載入器,完全由jvm控制載入,外面訪問不到這個類載入器,即不能被java程式引用。它主要負責載入jvm自身的工作類,即java/lib目錄和-Xbootclasspath引數指定的目錄的類庫。
2、Extension ClassLoader
擴充套件類載入器,由java實現,即ExtClassLoader實現類。它主要負責載入java/lib/ext目錄和系統環境變數java.ext.dirs指定目錄所有類庫。
3、Application ClassLoader
應用程式類載入器,由java實現,即AppClassLoader實現類。它的父類是ExtClassLoader,它主要負責載入classpath目錄上的類庫。如果沒有自定義ClassLoader,它就是程式中預設的ClassLoader,即可以通過ClassLoader.getSystemClassLoader()獲取當前系統的類載入器。
從上圖看雖然Bootstrap ClassLoader是最頂層的類載入器,但是不能被程式引用,它也不是ExtClassLoader的父類載入器,ExtClassLoader沒有父類載器,我們不防來看下面簡單的例子。
程式首先輸出了程式預設的類載入器AppClassLoader,然後再輸出了其父類載入器ExtClassLoader,然後就完了,這就證實了上面的理論。
類載入機制
雖然定義了上面這幾個類載入器,但在載入時類載入器會審查一個class類應該由哪個型別的載入器負責載入,它使用的是等級載入機制,是一種雙親委派模型。
雙親委派模式要求所有類載入器,除了頂層的Bootstrap類載入器之外都要有自己的父類載入器。在收到一個類載入請求時,當前預設的類載入器它不會首先自己來載入這個類,它會委託給自己的父類載入器去載入,父類載入器再委託給父父類載入器,以此類推,直到頂層類載入器,由上到下載入,除非上面的類載入器都無法載入時自己才去載入。
來看看ClassLoader.loadClass方法原始碼
再回到之前文章中的有一道關於是否可以自定義類java.lang.String並使用的面試題,它在java/lib目錄下,所以當應用類載入器去classpath載入時會去委託父類載入器,這時最頂層類載入器會發現自己之前已經載入過,所以這次不再載入,所以自定義的這個java.lang.String雖然可以正常編譯,但不能被類載入器載入並使用。
所以,這也是雙親委派模式的好處,同一個路徑的類保證不能載入兩次,保證了類與類之間的正常行為和正常執行。
相關文章
- Java基礎篇—Java類載入機制Java
- java類載入機制Java
- JVM 第三篇:Java 類載入機制JVMJava
- 深入理解Java虛擬機器 - 類載入機制Java虛擬機
- 深入理解Java虛擬機器(類載入機制)Java虛擬機
- 深入理解Java虛擬機器 --- 類載入機制Java虛擬機
- 【進階之路】深入理解Java虛擬機器的類載入機制(長文)Java虛擬機
- 阿里面試題,深入理解Java類載入機制阿里面試題Java
- 深入淺出JVM(三)之HotSpot虛擬機器類載入機制JVMHotSpot虛擬機
- Java開發工程師進階篇——深入淺出Java集合框架Java工程師框架
- Java類載入機制總結Java
- 談談 Java 類載入機制Java
- 深入java虛擬機器學習–類的載入機制(四)Java虛擬機機器學習
- VSCode For Web 深入淺出 -- 外掛載入機制VSCodeWeb
- Java開發工程師進階篇-深入淺出RedisJava工程師Redis
- JAVA重試機制多種方式深入淺出Java
- JVM深入淺出 -- Java記憶體分配機制JVMJava記憶體
- java虛擬機器類載入機制Java虛擬機
- Java 虛擬機器類載入機制Java虛擬機
- Java類載入機制-雙親委派Java
- Java 技術之類載入機制Java
- Java 虛擬機器之四:Java類載入機制Java虛擬機
- Java基礎-類載入器以及載入機制Java
- Java類載入機制詳解【java面試題】Java面試題
- Java安全基礎之Java反射機制和ClassLoader類載入機制Java反射
- Java虛擬機器(六):類載入機制Java虛擬機
- Java面試題之Java類載入機制詳解!Java面試題
- Java類載入機制,這篇大概、也許、可能就夠了Java
- JVM(三)-java虛擬機器類載入機制JVMJava虛擬機
- 一文學會 Java 類載入機制Java
- 深入理解OSGi類載入機制
- 基礎篇:深入解析JAVA反射機制Java反射
- 深入淺出Java執行緒池:使用篇Java執行緒
- 【Java虛擬機器規範】JVM類載入機制Java虛擬機JVM
- 十二、java知識點——類載入機制(硬貨)Java
- 從萌新的角度理解 Java 類載入機制Java
- 我竟然不再抗拒 Java 的類載入機制了Java
- Java核心技術梳理-類載入機制與反射Java反射