1.1類加載器【了解】
作用
負責将.class檔案(存儲的實體檔案)加載在到記憶體中
1.2類加載的過程【了解】
類加載時機
- 建立類的執行個體(對象)
- 調用類的類方法
- 通路類或者接口的類變量,或者為該類變量指派
- 使用反射方式來強制建立某個類或接口對應的java.lang.Class對象
- 初始化某個類的子類
- 直接使用java.exe指令來運作某個主類
類加載過程
1. 加載
- 通過包名 + 類名,擷取這個類,準備用流進行傳輸
- 在這個類加載到記憶體中
- 加載完畢建立一個class對象
2. 連結
驗證
確定Class檔案位元組流中包含的資訊符合目前虛拟機的要求,并且不會危害虛拟機自身安 全
(檔案中的資訊是否符合虛拟機規範有沒有安全隐患)
準備
負責為類的類變量(被static修飾的變量)配置設定記憶體,并設定預設初始化值 (初始化靜态變量)
解析
将類的二進制資料流中的符号引用替換為直接引用
(本類中如果用到了其他類,此時就需要找到對應的類)
3. 初始化
根據程式員通過程式制定的主觀計劃去初始化類變量和其他資源
(靜态變量指派以及初始化其他資源)
小結
- 當一個類被使用的時候,才會加載到記憶體
- 類加載的過程: 加載、驗證、準備、解析、初始化
1.3類加載的分類【了解】
分類
- Bootstrap class loader:虛拟機的内置類加載器,通常表示為null ,并且沒有父null
- Platform class loader:平台類加載器,負責加載JDK中一些特殊的子產品
- System class loader:系統類加載器,負責加載使用者類路徑上所指定的類庫
類加載器的繼承關系
- System的父加載器為Platform
- Platform的父加載器為Bootstrap
代碼示範
public class ClassLoaderDemo1 {
public static void main(String[] args) {
//擷取系統類加載器
ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
//擷取系統類加載器的父加載器 --- 平台類加載器
ClassLoader classLoader1 = systemClassLoader.getParent();
//擷取平台類加載器的父加載器 --- 啟動類加載器
ClassLoader classLoader2 = classLoader1.getParent();
System.out.println("系統類加載器" + systemClassLoader);
System.out.println("平台類加載器" + classLoader1);
System.out.println("啟動類加載器" + classLoader2);
}
}
1.4雙親委派模型【了解】
介紹
如果一個類加載器收到了類加載請求,它并不會自己先去加載,而是把這個請求委托給父類的加載 器去執行,如果父類加載器還存在其父類加載器,則進一步向上委托,依次遞歸,請求最終将到達 頂層的啟動類加載器,如果父類加載器可以完成類加載任務,就成功傳回,倘若父類加載器無法完 成此加載任務,子加載器才會嘗試自己去加載,這就是雙親委派模式
1.5 ClassLoader 中的兩個方法【應用】
方法介紹
方法名 | 說明 |
public static ClassLoader getSystemClassLoader() | 擷取系統類加載器 |
public InputStream getResourceAsStream(String name) | 加載某一個資源檔案 |
示例代碼
public class ClassLoaderDemo2 {
public static void main(String[] args) throws IOException {
//static ClassLoader getSystemClassLoader() 擷取系統類加載器 //InputStream getResourceAsStream(String name) 加載某一個資源檔案
//擷取系統類加載器
ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
//利用加載器去加載一個指定的檔案
//參數:檔案的路徑 (放在src的根目錄下,預設去那裡加載)
//傳回值:位元組流。
InputStream is =
systemClassLoader.getResourceAsStream("prop.properties");
Properties prop = new Properties();
prop.load(is);
System.out.println(prop);
is.close();
}
}