什麼是類的加載
1.概述
Class文件由類裝載器裝載後,在JVM中將形成一份描述Class結構的元信息對象,通過該元信息對象可以獲知Class的結構信息:如構造函數,屬性和方法等,Java允許用戶藉由這個Class相關的元信息對象間接調用Class對象的功能。
虛擬機把描述類的數據從class文件加載到內存,並對數據進行校驗,轉換解析和初始化,最終形成可以被虛擬機直接使用的Java類型,這就是虛擬機的類加載機制。
2.工作機制
類裝載器就是尋找類的字節碼文件,並構造出類在JVM內部表示的對象組件。在Java中,類裝載器把一個類裝入JVM中,要經過以下步驟:
(1) 裝載:查找和導入Class文件;
(2) 鏈接:把類的二進制數據合併到JRE中;
(a)校驗:檢查載入Class文件數據的正確性;
(b)準備:給類的靜態變量分配存儲空間;
(c)解析:將符號引用轉成直接引用;
(3) 初始化:對類的靜態變量,靜態代碼塊執行初始化操作
3.JVM初始化步驟
1、假如這個類還沒有被加載和連接,則程序先加載並連接該類
2、假如該類的直接父類還沒有被初始化,則先初始化其直接父類
3、假如類中有初始化語句,則系統依次執行這些初始化語句
4.類的初始化時機:
1.創建類的實例,也就是new的方式
2.訪問某個類或接口的靜態變量,或者對該靜態變量賦值
3.調用類的靜態方法
5.反射(如Class.forName(“com.shengsiyuan.Test”))
5.初始化某個類的子類,則其父類也會被初始化
6.Java虛擬機啓動時被標明爲啓動類的類(Java Test),直接使用java.exe命令來運行某個主類
5.類的結束生命週期
1.執行了System.exit()方法
2.程序的正常執行結束
3.程序在執行過程中遇到了異常或錯誤而異常終止
4.由於操作系統出現錯誤而導致Java虛擬機進程終止
6.類的加載機制
1.全盤負責
當一個類加載器負責加載某個Class時,該Class所依賴的和引用的其他Class也將由該類加載器負責載入,除非顯示使用另外一個類加載器來載入
2.父類委託
先讓父類加載器試圖加載該類,只有在父類加載器無法加載該類時才嘗試從自己的類路徑中加載該類
3.緩存機制
緩存機制將會保證所有加載過的Class都會被緩存,當程序中需要使用某個Class時,類加載器先從緩存區尋找該Class,只有緩存區不存在,系統纔會讀取該類對應的二進制數據,並將其轉換成Class對象,存入緩存區。這就是爲什麼修改了Class後,必須重啓JVM,程序的修改纔會生效
7.類的加載方式
1.命令行啓動應用時候由JVM初始化加載
2.通過Class.forName()方法動態加載
3.通過ClassLoader.loadClass()方法動態加載
Class.forName()和ClassLoader.loadClass()區別
Class.forName():將類的.class文件加載到jvm中之外,還會對類進行解釋,執行類中的static塊;
ClassLoader.loadClass():只幹一件事情,就是將.class文件加載到jvm中,不會執行static中的內容,只有在newInstance纔會去執行static塊。
注:
Class.forName(name, initialize, loader)帶參函數也可控制是否加載static塊。並且只有調用了newInstance()方法採用調用構造函數,創建類的對象 。
8.雙親委派模型
雙親委派模型的工作流程是:如果一個類加載器收到了類加載的請求,它首先不會自己去嘗試加載這個類,而是把請求委託給父加載器去完成,依次向上,因此,所有的類加載請求最終都應該被傳遞到頂層的啓動類加載器中,只有當父加載器在它的搜索範圍中沒有找到所需的類時,即無法完成該加載,子加載器纔會嘗試自己去加載該類。