溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java類加載是如何執(zhí)行的

發(fā)布時(shí)間:2022-02-23 15:22:00 來源:億速云 閱讀:110 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“Java類加載是如何執(zhí)行的”的相關(guān)知識(shí),小編通過實(shí)際案例向大家展示操作過程,操作方法簡(jiǎn)單快捷,實(shí)用性強(qiáng),希望這篇“Java類加載是如何執(zhí)行的”文章能幫助大家解決問題。

類加載器

  • 類加載器作用

負(fù)責(zé)將.class文件(存儲(chǔ)的物理文件)加載到內(nèi)存中

  • 類加載器過程

加載:通過全類名獲取這個(gè)類準(zhǔn)備用流傳輸,加載進(jìn)內(nèi)存,加載完畢創(chuàng)建一個(gè)Class對(duì)象

鏈接

驗(yàn)證:確保Class文件字節(jié)流中包含的信息符合當(dāng)前虛擬機(jī)的要求,并且不會(huì)危害虛擬機(jī)自身安全

(文件中的信息是否符合虛擬機(jī)規(guī)范有沒有安全隱患)準(zhǔn)備:負(fù)責(zé)為類的類變量(被static修飾的變量)分配內(nèi)存,并設(shè)置默認(rèn)初始化值

(初始化靜態(tài)變量)解析:將類的二進(jìn)制數(shù)據(jù)流中的符號(hào)引用替換為直接引用
(本類中如果用到了其他類,此時(shí)就需要找到對(duì)應(yīng)的類)

初始化:根據(jù)程序員通過程序制定的主觀計(jì)劃去初始化類變量和其他資源(也就是自己寫的構(gòu)造函數(shù)初始化)
(靜態(tài)變量賦值以及初始化其他資源)

  • 類加載分類

Bootstrap class loader:虛擬機(jī)的內(nèi)置類加載器,通常表示為null ,并且沒有父null

Platform class loader:平臺(tái)類加載器,負(fù)責(zé)加載JDK中一些特殊的模塊

System class loader:系統(tǒng)類加載器,負(fù)責(zé)加載用戶類路徑上所指定的類庫

類加載器繼承關(guān)系

System的父加載器為Platform

Platform的父加載器為Bootstrap

代碼示例

public class ClassLoaderDemo1 {
    public static void main(String[] args) {
        //獲取系統(tǒng)類加載器
        ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();

        //獲取系統(tǒng)類加載器的父加載器 --- 平臺(tái)類加載器
        ClassLoader classLoader1 = systemClassLoader.getParent();

        //獲取平臺(tái)類加載器的父加載器 --- 啟動(dòng)類加載器
        ClassLoader classLoader2 = classLoader1.getParent();

        System.out.println("系統(tǒng)類加載器" + systemClassLoader);
        System.out.println("平臺(tái)類加載器" + classLoader1);
        System.out.println("啟動(dòng)類加載器" + classLoader2);

    }
}

雙親委派模型

 如果一個(gè)類加載器收到了類加載請(qǐng)求,它并不會(huì)自己先去加載,而是把這個(gè)請(qǐng)求委托給父類的加載器去執(zhí)行,如果父類加載器還存在其父類加載器,則進(jìn)一步向上委托,依次遞歸,請(qǐng)求最終將到達(dá)頂層的啟動(dòng)類加載器,如果父類加載器可以完成類加載任務(wù),就成功返回,倘若父類加載器無法完成此加載任務(wù),子加載器才會(huì)嘗試自己去加載,這就是雙親委派模式(一句話意思就是加載類先讓父類的加載器去加載,如果父類加載不了就會(huì)重新向下讓子類加載器依次去加載知道找到加載的類加載器)

ClassLoader 中的兩個(gè)方法

方法介紹

方法名說明
public static ClassLoader getSystemClassLoader()獲取系統(tǒng)類加載器
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)類加載器
        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類加載是如何執(zhí)行的”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI