1. 程式人生 > 其它 >JavaSE-24.1【類載入器】

JavaSE-24.1【類載入器】

 1 package day15.lesson1;
 2 
 3 /*
 4 1 類載入器
 5 
 6 1.1 類載入
 7 
 8     (1)類載入的描述
 9         當程式要使用某個類時,如果該類還未被載入到記憶體中,則系統會通過
10         類的載入,類的連線,類的初始化這三個步驟來對類進行初始化。
11         如果不出現意外情況,JVM將會連續完成這三個步驟,所以有時也把這三個步驟統稱為類載入或者類初始化。
12         <1>類的載入
13             就是指將class檔案讀入記憶體,併為之建立一個 java.lang.Class 物件任何類被使用時,
14 系統都會為之建立一個 java.lang.Class 物件 15 <2>類的連線 16 驗證階段:用於檢驗被載入的類是否有正確的內部結構,並和其他類協調一致 17 準備階段:負責為類的類變數分配記憶體,並設定預設初始化值 18 解析階段:將類的二進位制資料中的符號引用替換為直接引用 19 <3>類的初始化 20 在該階段,主要就是對類變數進行初始化 21 22 (2)類的初始化步驟 23 假如類還未被載入和連線,則程式先載入並連線該類
24 假如該類的直接父類還未被初始化,則先初始化其直接父類 25 假如類中有初始化語句,則系統依次執行這些初始化語句 26 注意:在執行第2個步驟的時候,系統對直接父類的初始化步驟也遵循初始化步驟1-3 27 28 (3)類的初始化時機 29 建立類的例項 30 呼叫類的類方法 31 訪問類或者介面的類變數,或者為該類變數賦值 32 使用反射方式來強制建立某個類或介面對應的java.lang.Class物件 33 初始化某個類的子類 34 直接使用java.exe命令來執行某個主類
35 36 1.2 類載入器 37 38 (1)類載入器的作用 39 負責將.class檔案載入到記憶體中,併為之生成對應的 java.lang.Class 物件。 40 雖然我們不用過分關心類載入機制,但是瞭解這個機制我們就能更好的理解程式的執行。 41 ClassLoder:是負責載入類的物件 42 43 (2)JVM的類載入機制 44 全盤負責:就是當一個類載入器負責載入某個Class時,該Class所依賴的和引用的其他Class也將由該類載入器負責載入, 45 除非顯示使用另外一個類載入器來載入 46 父類委託:就是當一個類載入器負責載入某個Class時,先讓父類載入器試圖載入該Class, 47 只有在父類載入器無法載入該類時才嘗試從自己的類路徑中載入該類 48 快取機制:保證所有載入過的Class都會被快取,當程式需要使用某個Class物件時,類載入器先從快取區中搜索該Class, 49 只有當快取區中不存在該Class物件時,系統才會讀取該類對應的二進位制資料,並將其轉換成Class物件,儲存到快取區 50 51 (3)Java執行時具有以下內建類載入器 52 Bootstrap class loader:它是虛擬機器的內建類載入器,通常表示為null ,並且沒有父null 53 Platform class loader:平臺類載入器可以看到所有平臺類 ,平臺類包括由平臺類載入器或其祖先定義的JavaSE平臺API, 54 其實現類和JDK特定的執行時類 55 System class loader:它也被稱為應用程式類載入器 ,與平臺類載入器不同。 56 系統類載入器通常用於定義應用程式類路徑,模組路徑和JDK特定工具上的類 57 類載入器的繼承關係:System的父載入器為Platform,而Platform的父載入器為Bootstrap 58 59 (4)ClassLoader中的兩個方法 60 static ClassLoader getSystemClassLoader() 返回用於委派的系統類載入器 61 ClassLoader getParent() 返回父類載入器進行委派 62 */ 63 public class Demo1ClassLoader { 64 public static void main(String[] args) { 65 //System class loader 66 ClassLoader c = ClassLoader.getSystemClassLoader(); 67 System.out.println(c); //sun.misc.Launcher$AppClassLoader@18b4aac2 68 69 //Platform class loader 70 ClassLoader c2 = c.getParent(); 71 System.out.println(c2); //sun.misc.Launcher$ExtClassLoader@4554617c 72 73 //Bootstrap class loader 74 ClassLoader c3 = c2.getParent(); 75 System.out.println(c3); //null 76 } 77 }