JVM中類的裝載是由類加載器(ClassLoader)和它的子類來(lái)實(shí)現(xiàn)的什湘,Java中的類加載器是一個(gè)重要的Java運(yùn)行時(shí)系統(tǒng)組件,它負(fù)責(zé)在運(yùn)行時(shí)查找和裝入類文件中的類。
由于Java的跨平臺(tái)性,經(jīng)過(guò)編譯的Java源程序并不是一個(gè)可執(zhí)行程序污尉,而是一個(gè)或多個(gè)類文件。當(dāng)Java程序需要使用某個(gè)類時(shí)往产,JVM會(huì)確保這個(gè)類已經(jīng)被加載被碗、連接(驗(yàn)證、準(zhǔn)備和解析)和初始化仿村。類的加載是指把類的.class文件中的數(shù)據(jù)讀入到內(nèi)存中锐朴,通常是創(chuàng)建一個(gè)字節(jié)數(shù)組讀入.class文件,然后產(chǎn)生與所加載類對(duì)應(yīng)的Class對(duì)象奠宜。加載完成后包颁,Class對(duì)象還不完整,所以此時(shí)的類還不可用压真。當(dāng)類被加載后就進(jìn)入連接階段,這一階段包括驗(yàn)證蘑险、準(zhǔn)備(為靜態(tài)變量分配內(nèi)存并設(shè)置默認(rèn)的初始值)和解析(將符號(hào)引用替換為直接引用)三個(gè)步驟滴肿。最后JVM對(duì)類進(jìn)行初始化,包括:1)如果類存在直接的父類并且這個(gè)類還沒(méi)有被初始化佃迄,那么就先初始化父類泼差;2)如果類中存在初始化語(yǔ)句,就依次執(zhí)行這些初始化語(yǔ)句呵俏。
類的加載是由類加載器完成的堆缘,類加載器包括:根加載器(BootStrap)、擴(kuò)展加載器(Extension)普碎、系統(tǒng)加載器(System)和用戶自定義類加載器(java.lang.ClassLoader的子類)吼肥。 從Java 2(JDK 1.2)開(kāi)始,類加載過(guò)程采取了父親委托機(jī)制(PDM)缀皱。PDM更好的保證了Java平臺(tái)的安全性斗这,在該機(jī)制中,JVM自帶的Bootstrap是根加載器啤斗,其他的加載器都有且僅有一個(gè)父類加載器表箭。類的加載首先請(qǐng)求父類加載器加載,父類加載器無(wú)能為力時(shí)才由其子類加載器自行加載钮莲。JVM不會(huì)向Java程序提供對(duì)Bootstrap的引用免钻。下面是關(guān)于幾個(gè)類加載器的說(shuō)明:
? ? ? Bootstrap:一般用本地代碼實(shí)現(xiàn),負(fù)責(zé)加載JVM基礎(chǔ)核心類庫(kù)(rt.jar)崔拥;
Extension:從java.ext.dirs系統(tǒng)屬性所指定的目錄中加載類庫(kù)伯襟,它的父加載器是Bootstrap;
System:又叫應(yīng)用類加載器握童,其父類是Extension姆怪。它是應(yīng)用最廣泛的類加載器。它從環(huán)境變量classpath或者系統(tǒng)屬性java.class.path所指定的目錄中記載類澡绩,是用戶自定義加載器的默認(rèn)父加載器稽揭。