類(lèi)加載器
- 類(lèi)加載器作用
負(fù)責(zé)將.class文件(存儲(chǔ)的物理文件)加載到內(nèi)存中
- 類(lèi)加載器過(guò)程
加載:通過(guò)全類(lèi)名獲取這個(gè)類(lèi)準(zhǔn)備用流傳輸,加載進(jìn)內(nèi)存,加載完畢創(chuàng)建一個(gè)Class對(duì)象
鏈接
驗(yàn)證:確保Class文件字節(jié)流中包含的信息符合當(dāng)前虛擬機(jī)的要求,并且不會(huì)危害虛擬機(jī)自身安全
(文件中的信息是否符合虛擬機(jī)規(guī)范有沒(méi)有安全隱患)準(zhǔn)備:負(fù)責(zé)為類(lèi)的類(lèi)變量(被static修飾的變量)分配內(nèi)存,并設(shè)置默認(rèn)初始化值
(初始化靜態(tài)變量)解析:將類(lèi)的二進(jìn)制數(shù)據(jù)流中的符號(hào)引用替換為直接引用
(本類(lèi)中如果用到了其他類(lèi),此時(shí)就需要找到對(duì)應(yīng)的類(lèi))
初始化:根據(jù)程序員通過(guò)程序制定的主觀計(jì)劃去初始化類(lèi)變量和其他資源(也就是自己寫(xiě)的構(gòu)造函數(shù)初始化)
(靜態(tài)變量賦值以及初始化其他資源)
- 類(lèi)加載分類(lèi)
Bootstrap class loader:虛擬機(jī)的內(nèi)置類(lèi)加載器,通常表示為null ,并且沒(méi)有父null
Platform class loader:平臺(tái)類(lèi)加載器,負(fù)責(zé)加載JDK中一些特殊的模塊
System class loader:系統(tǒng)類(lèi)加載器,負(fù)責(zé)加載用戶(hù)類(lèi)路徑上所指定的類(lèi)庫(kù)
類(lèi)加載器繼承關(guān)系
System的父加載器為Platform
Platform的父加載器為Bootstrap
代碼示例
public class ClassLoaderDemo1 {
public static void main(String[] args) {
//獲取系統(tǒng)類(lèi)加載器
ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
//獲取系統(tǒng)類(lèi)加載器的父加載器 --- 平臺(tái)類(lèi)加載器
ClassLoader classLoader1 = systemClassLoader.getParent();
//獲取平臺(tái)類(lèi)加載器的父加載器 --- 啟動(dòng)類(lèi)加載器
ClassLoader classLoader2 = classLoader1.getParent();
System.out.println("系統(tǒng)類(lèi)加載器" + systemClassLoader);
System.out.println("平臺(tái)類(lèi)加載器" + classLoader1);
System.out.println("啟動(dòng)類(lèi)加載器" + classLoader2);
}
}
雙親委派模型
如果一個(gè)類(lèi)加載器收到了類(lèi)加載請(qǐng)求,它并不會(huì)自己先去加載,而是把這個(gè)請(qǐng)求委托給父類(lèi)的加載器去執(zhí)行,如果父類(lèi)加載器還存在其父類(lèi)加載器,則進(jìn)一步向上委托,依次遞歸,請(qǐng)求最終將到達(dá)頂層的啟動(dòng)類(lèi)加載器,如果父類(lèi)加載器可以完成類(lèi)加載任務(wù),就成功返回,倘若父類(lèi)加載器無(wú)法完成此加載任務(wù),子加載器才會(huì)嘗試自己去加載,這就是雙親委派模式(一句話(huà)意思就是加載類(lèi)先讓父類(lèi)的加載器去加載,如果父類(lèi)加載不了就會(huì)重新向下讓子類(lèi)加載器依次去加載知道找到加載的類(lèi)加載器)
ClassLoader 中的兩個(gè)方法
方法介紹
方法名 | 說(shuō)明 |
public static ClassLoader getSystemClassLoader() | 獲取系統(tǒng)類(lèi)加載器 |
public InputStream getResourceAsStream(String name) | 加載某一個(gè)資源文件 |
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class Demo {
public static void main(String[] args) throws IOException {
//獲取系統(tǒng)類(lèi)加載器
ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
//利用加載器去加載一個(gè)指定的文件
//參數(shù):文件的路徑(放在src的根目錄下,默認(rèn)去那里加載)
//返回值:字節(jié)流。
InputStream is = systemClassLoader.getResourceAsStream("prop.properties");
Properties prop = new Properties();
prop.load(is);
System.out.println(prop.getProperty("name"));
is.close();
}
}
到此這篇關(guān)于 Java 類(lèi)加載相關(guān)的內(nèi)容總結(jié)就介紹到這結(jié)束了,想要了解更多相關(guān) Java 類(lèi)加載其他的詳細(xì)內(nèi)容請(qǐng)搜索W3Cschool以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持我們!