類的加載器是將.class文件,加載到內存(JVM)中,並生成java.lang.class對象。
加載到JVM中的類都有一個唯一的標識,用其包名和類名作爲其標識(java.lang.String就相當於一個標識)。
JVM在運行時會產生3個類加載器組成的初始化加載器層次結構
App/System ClassLoader
系統(應用)類加載器:負責java –classpath 或 –D java.class.path所指的目錄下的類與jar包裝入工作 ,是最常用的加載器
可以通過ClassLoader的靜態方法getSystemLoader()來獲取系統類的加載器。如果沒有特別指定,則用戶自定義的類的加載器都以此類加載器作爲父類。
Extension ClassLoader
擴展類加載器:負責jre/lib/ext目錄下的jar包或 –D java.ext.dirs 指定目錄下的jar包裝入工作庫
Bootstrap ClassLoader
引導類加載器:用C++編寫的,是JVM自帶的類加載器,負責Java平臺核心庫,用來加載核心類庫。該加載器無法直接獲取
從 系統類加載器 到 擴展類加載器 到 引導類加載器,檢查是否已加載,反之嘗試加載類。
JVM的根加載器並不是由java實現的,所以無法通過程序獲取跟加載器Bootstrap ClassLoader
類加載器加載Class大致要經過幾個步驟
- 檢測此Class是否載入過(及在緩存區中知否由此Class),如果有則直接最後一步。
- 如果父類加載器存在,則是直接使用父類在加載器去加載目標類,否則直接使用根加載器去加載載入目標類。如果能找到目標類的文件則直接加載成功,否則拋出ClassNotFoundException異常。
- 返回對應的java.lang.Class類對象。