天天看點

你對Java類加載器(自定義類加載器)有了解嗎?

作者:騰科IT教育

1.1類加載器【了解】

作用

負責将.class檔案(存儲的實體檔案)加載在到記憶體中

你對Java類加載器(自定義類加載器)有了解嗎?

1.2類加載的過程【了解】

類加載時機

  • 建立類的執行個體(對象)
  • 調用類的類方法
  • 通路類或者接口的類變量,或者為該類變量指派
  • 使用反射方式來強制建立某個類或接口對應的java.lang.Class對象
  • 初始化某個類的子類
  • 直接使用java.exe指令來運作某個主類

類加載過程

1. 加載

  • 通過包名 + 類名,擷取這個類,準備用流進行傳輸
  • 在這個類加載到記憶體中
  • 加載完畢建立一個class對象
你對Java類加載器(自定義類加載器)有了解嗎?

2. 連結

驗證

確定Class檔案位元組流中包含的資訊符合目前虛拟機的要求,并且不會危害虛拟機自身安 全

(檔案中的資訊是否符合虛拟機規範有沒有安全隐患)

你對Java類加載器(自定義類加載器)有了解嗎?
你對Java類加載器(自定義類加載器)有了解嗎?

準備

負責為類的類變量(被static修飾的變量)配置設定記憶體,并設定預設初始化值 (初始化靜态變量)

你對Java類加載器(自定義類加載器)有了解嗎?
你對Java類加載器(自定義類加載器)有了解嗎?

解析

将類的二進制資料流中的符号引用替換為直接引用

(本類中如果用到了其他類,此時就需要找到對應的類)

你對Java類加載器(自定義類加載器)有了解嗎?

3. 初始化

根據程式員通過程式制定的主觀計劃去初始化類變量和其他資源

(靜态變量指派以及初始化其他資源)

你對Java類加載器(自定義類加載器)有了解嗎?

小結

  • 當一個類被使用的時候,才會加載到記憶體
  • 類加載的過程: 加載、驗證、準備、解析、初始化

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雙親委派模型【了解】

介紹

如果一個類加載器收到了類加載請求,它并不會自己先去加載,而是把這個請求委托給父類的加載 器去執行,如果父類加載器還存在其父類加載器,則進一步向上委托,依次遞歸,請求最終将到達 頂層的啟動類加載器,如果父類加載器可以完成類加載任務,就成功傳回,倘若父類加載器無法完 成此加載任務,子加載器才會嘗試自己去加載,這就是雙親委派模式

你對Java類加載器(自定義類加載器)有了解嗎?

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();
}
}           

繼續閱讀