溫馨提示×

溫馨提示×

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

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

java 中如何實(shí)現(xiàn)一個(gè)類加載器

發(fā)布時(shí)間:2021-07-01 14:54:14 來源:億速云 閱讀:129 作者:Leah 欄目:大數(shù)據(jù)

java 中如何實(shí)現(xiàn)一個(gè)類加載器,相信很多沒有經(jīng)驗(yàn)的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。

      class類文件只有通過類加載器加載后才能new出實(shí)例對象,因此不同類加載器中的對象和類都是不同的(即使類文件相同)。

      java中的類加載器主要包括引導(dǎo)類加載器、擴(kuò)展類加載器、系統(tǒng)類加載器以及自定義類加載器,并且各個(gè)類加載器之間按照樹狀層級(也稱雙親委派)進(jìn)行組合。引導(dǎo)類加載器負(fù)責(zé)加載lib目錄中的類庫并且該類加載器不能被java程序直接引用;擴(kuò)展類加載器負(fù)責(zé)加載ext目錄中類庫但可被java程序直接引用,所有能被java程序直接引用的類加載器都繼承于CLassLoader抽象類;系統(tǒng)類加載器負(fù)責(zé)加載由classpath指定的類庫;自定義類加載器負(fù)責(zé)加載由用戶指定路徑的類庫。

     各個(gè)類加載器之間(除了引導(dǎo)類加載器)采用組合模式進(jìn)行設(shè)計(jì),所以一般在自定義類加載器時(shí)都需要指定一個(gè)父類加載器。這樣設(shè)計(jì)的好處是避免同一類庫的重復(fù)加載從而節(jié)約資源,并且當(dāng)加載某個(gè)類文件時(shí)如果父加載器已經(jīng)加載過就不會重復(fù)加載相同的類文件(類文件通過包名和類名進(jìn)行唯一標(biāo)識,如果不這樣做,當(dāng)用戶寫了一個(gè)java.lang.String類,就會使得已經(jīng)寫好的程序發(fā)生錯亂,并且用戶可以隨機(jī)寫一個(gè)與系統(tǒng)類相同的類文件進(jìn)行惡意破壞)。

以下代碼可對上述進(jìn)行驗(yàn)證:


public class ClassLoaderTest {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println(ClassLoaderTest.class.getClassLoader());       //1
        System.out.println(ClassLoader.getSystemClassLoader());          //2
        System.out.println(ClassLoaderTest.class.getClassLoader().getParent());   //3
        System.out.println(ClassLoaderTest.class.getClassLoader().getParent().getParent());   //4
    }

}

第1行和第2行代表系統(tǒng)類加載器,第3行代表擴(kuò)展類加載器也是系統(tǒng)類加載器的父加載器,第4行是我們試圖獲取擴(kuò)展類加載器的父加載器即引導(dǎo)類加載器但是返回的結(jié)果為空(印證了引導(dǎo)類加載器不能直接被java程序引用)。

看完上述內(nèi)容,你們掌握java 中如何實(shí)現(xiàn)一個(gè)類加載器的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

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

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

AI