亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳解Java類(lèi)加載機(jī)制中的雙親委派模型

 更新時(shí)間:2023年09月15日 09:24:34   作者:小威要向諸佬學(xué)習(xí)呀  
Java的雙親委派模型是一種類(lèi)加載機(jī)制,它用于保證Java類(lèi)的安全性和穩(wěn)定性,在這個(gè)模型中,當(dāng)一個(gè)類(lèi)需要被加載時(shí),Java虛擬機(jī)會(huì)先檢查自己是否已經(jīng)加載了該類(lèi),本文就給大家講解一下Java類(lèi)加載機(jī)制中的雙親委派模型,需要的朋友可以參考下

Java中的類(lèi)加載器

在介紹雙親委派模型之前,首先先介紹下Java中的類(lèi)加載器。

啟動(dòng)類(lèi)加載器(Bootstrap ClassLoader)

首先先介紹下類(lèi)加載器中的重量級(jí)器物,就是大名鼎鼎--啟動(dòng)類(lèi)加載器。

為什么說(shuō)他是重量級(jí)的恩,因?yàn)?strong>它是Java類(lèi)加載器層次結(jié)構(gòu)的最頂層,由虛擬機(jī)實(shí)現(xiàn),用于加載Java核心類(lèi)庫(kù),如java.lang和java.util等。

既然是最頂層的類(lèi)加載器,我們就康康它有什么作用:

啟動(dòng)類(lèi)加載器是由C/C++編寫(xiě)的,無(wú)法直接在Java代碼中獲取其引用。 它負(fù)責(zé)加載Java運(yùn)行時(shí)環(huán)境所需的基本類(lèi)。

擴(kuò)展類(lèi)加載器(Extension ClassLoader)

接著我們看一下Java加載器中的第二號(hào)人物--擴(kuò)展類(lèi)加載器。

擴(kuò)展類(lèi)加載器是由Java編寫(xiě)的,它是啟動(dòng)類(lèi)加載器的子類(lèi)。 它負(fù)責(zé)加載Java擴(kuò)展類(lèi)庫(kù),位于jre/lib/ext路徑下的JAR文件。 擴(kuò)展類(lèi)加載器可以通過(guò)java.ext.dirs系統(tǒng)屬性來(lái)指定其他目錄作為擴(kuò)展類(lèi)庫(kù)的路徑。

應(yīng)用程序類(lèi)加載器(Application ClassLoader)

接著介紹最底層的加載器--應(yīng)用程序類(lèi)加載器。

應(yīng)用程序類(lèi)加載器是Java類(lèi)加載器層次結(jié)構(gòu)的最底層,也稱(chēng)為系統(tǒng)類(lèi)加載器。 它負(fù)責(zé)加載應(yīng)用程序類(lèi)路徑(Classpath)下的類(lèi),包括開(kāi)發(fā)者自己編寫(xiě)的類(lèi)和第三方庫(kù)。 應(yīng)用程序類(lèi)加載器可以通過(guò)-classpath或-cp選項(xiàng)來(lái)指定加載類(lèi)的路徑。

自定義類(lèi)加載器(Custom ClassLoader)

除了上述系統(tǒng)類(lèi)的加載器,我們開(kāi)發(fā)者還可以自定義加載器-驚不驚喜,意不意外。

自定義類(lèi)加載器是開(kāi)發(fā)者根據(jù)需求編寫(xiě)的自定義加載器,繼承自ClassLoader類(lèi)。 它可以根據(jù)特定的加載規(guī)則和需求,從不同的來(lái)源加載類(lèi),比如本地文件系統(tǒng)、網(wǎng)絡(luò)等。 自定義類(lèi)加載器需要實(shí)現(xiàn)findClass()方法,指定類(lèi)的加載規(guī)則,然后通過(guò)defineClass()方法加載類(lèi)的字節(jié)碼。

雙親委派模型

看到這里,上我們的重頭菜,這塊知識(shí)是面試中的重點(diǎn)內(nèi)容。

雙親委派(Parent Delegation)是Java類(lèi)加載機(jī)制中一種重要的實(shí)現(xiàn)方式,它通過(guò)一種遞歸的方式在類(lèi)加載器之間建立了父子關(guān)系,并且定義了類(lèi)加載的優(yōu)先級(jí)。該模型主要用于解決類(lèi)加載的沖突和隔離問(wèn)題,保證Java應(yīng)用程序的穩(wěn)定性和安全性。

在Java類(lèi)加載機(jī)制中,每個(gè)類(lèi)加載器都有一個(gè)父加載器。當(dāng)一個(gè)類(lèi)加載器需要加載一個(gè)類(lèi)時(shí),它首先會(huì)委托給它的父加載器進(jìn)行加載。只有當(dāng)父加載器無(wú)法加載時(shí),子加載器才會(huì)嘗試加載。這種遞歸的委派模型可以形成一個(gè)類(lèi)加載器的層次結(jié)構(gòu),稱(chēng)為類(lèi)加載器樹(shù)。

我看了《深入理解Java虛擬機(jī)-第三版》中的講解,挺詳細(xì)的,這里分享給大家:如果一個(gè)類(lèi)加載器收到了類(lèi)加載的請(qǐng)求,它首先不會(huì)自己去嘗試加載這個(gè)類(lèi),而是把這個(gè)請(qǐng)求委派給父類(lèi)加載器去完成,每一個(gè)層次的類(lèi)加載器都是如此,因此所有的加載請(qǐng)求最終都應(yīng)該傳送到最頂層的啟動(dòng)類(lèi)加載器中,只有當(dāng)父類(lèi)加載器反饋?zhàn)约簾o(wú)法加載這個(gè)請(qǐng)求時(shí),子加載器才會(huì)嘗試自己去加載。

雙親委派模型源碼

首先可以先嘗試自己看下源碼,非常通俗易懂:

protected synchronized Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
    // 首先,檢查類(lèi)是否已經(jīng)被加載
    Class<?> c = findLoadedClass(name);
    if (c == null) {
        try {
            if (parent != null) {
                // 如果父類(lèi)加載器存在,則委派給父類(lèi)加載器
                c = parent.loadClass(name, false);
            } else {
                // 否則,使用引導(dǎo)類(lèi)加載器進(jìn)行加載
                c = findBootstrapClassOrNull(name);
            }
        } catch (ClassNotFoundException e) {
            // 如果父類(lèi)加載器也無(wú)法找到類(lèi),則嘗試自己加載
            c = findClass(name);
        }
    }
    if (resolve) {
        resolveClass(c);
    }
    return c;
}

在上面的源碼中,我們可以看到雙親委派機(jī)制的體現(xiàn)。當(dāng)loadClass方法被調(diào)用時(shí),首先會(huì)檢查該類(lèi)是否已經(jīng)被加載。如果沒(méi)有加載,那么會(huì)按照以下步驟進(jìn)行處理:

  • 首先,調(diào)用findLoadedClass(name)方法檢查類(lèi)是否已經(jīng)被其他類(lèi)加載器加載過(guò)。如果是,則直接返回該類(lèi)的Class對(duì)象。

  • 如果這個(gè)類(lèi)還未加載,則嘗試委派給父類(lèi)加載器加載。通過(guò)parent.loadClass(name, false)方法,將類(lèi)加載任務(wù)傳遞給父類(lèi)加載器。這個(gè)過(guò)程中,父類(lèi)加載器會(huì)重復(fù)執(zhí)行上述流程,直到達(dá)到引導(dǎo)類(lèi)加載器為止。

  • 如果所有的父類(lèi)加載器都無(wú)法加載該類(lèi),那么會(huì)嘗試使用啟動(dòng)類(lèi)加載器加載。這是Java類(lèi)加載器層次結(jié)構(gòu)的最頂層。

  • 如果引導(dǎo)類(lèi)加載器仍然無(wú)法找到所需的類(lèi),就會(huì)調(diào)用findClass(name)方法在當(dāng)前類(lèi)加載器的作用域內(nèi)查找并加載該類(lèi)。

  • 到最后,如果resolve參數(shù)為true,就會(huì)調(diào)用resolveClass(c)方法進(jìn)一步解析和鏈接該類(lèi)。

如何打破雙親委派模型

其實(shí)雙親委派模型并不是具有強(qiáng)制性約束的模型,雖然它有助于保證類(lèi)的隔離和加載的順序,但有時(shí)候我們可能需要打破這種機(jī)制,比如我們?cè)谔厥馇闆r下需要自定義類(lèi)加載邏輯或?qū)崿F(xiàn)熱部署的時(shí)候。

上周面試問(wèn)道了這個(gè)問(wèn)題,所以在這里也介紹幾種打破Java中雙親委派機(jī)制的方法:

  • 自定義類(lèi)加載器:我們自定義一個(gè)繼承自ClassLoader的類(lèi)加載器,重寫(xiě)loadClass方法,可以實(shí)現(xiàn)自己的類(lèi)加載邏輯。在我們定義的這個(gè)方法中,可以在需要時(shí)跳過(guò)父類(lèi)加載器并直接加載類(lèi),從而打破雙親委派機(jī)制。但是,在自定義類(lèi)加載器中打破雙親委派機(jī)制可能會(huì)導(dǎo)致類(lèi)的隔離性和安全性問(wèn)題,所以我們?cè)谑褂脮r(shí)要慎重。

  • 線程上下文類(lèi)加載器:Java中提供了線程上下文類(lèi)加載器(Thread Context ClassLoader)的概念,它可以在某些情況下打破雙親委派機(jī)制。例如,在JNDI、SPI(Service Provider Interface)和一些框架中,線程上下文類(lèi)加載器可以用來(lái)加載指定的類(lèi),從而不受雙親委派機(jī)制的限制。

  • 通過(guò)反射機(jī)制:使用反射機(jī)制可以直接調(diào)用Class類(lèi)的defineClass方法,這樣可以繞過(guò)雙親委派機(jī)制直接加載指定的類(lèi)。但是,在使用這種方式時(shí),我們需要自行處理類(lèi)加載的順序和依賴(lài)關(guān)系,因?yàn)殡p親委派機(jī)制不再起作用。

綜上所述,不正確地使用或?yàn)E用這些方法可能導(dǎo)致類(lèi)加載沖突、安全問(wèn)題以及代碼的不穩(wěn)定性 ,因此我們還需要在明確的需求和充分的理解下使用(面試會(huì)背誦就行【手動(dòng)狗頭】)。

以上就是詳解Java類(lèi)加載機(jī)制中的雙親委派模型的詳細(xì)內(nèi)容,更多關(guān)于Java雙親委派模型的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java刪除String中指定字符的11種方法匯總

    Java刪除String中指定字符的11種方法匯總

    這篇文章主要給大家介紹了關(guān)于Java刪除String中指定字符的11種方法,在Java中String類(lèi)提供了許多方法來(lái)處理字符串,其中包括刪除指定字符的方法,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • Java使用反射獲取字段屬性

    Java使用反射獲取字段屬性

    這篇文章主要為大家詳細(xì)介紹了Java如何利用反射實(shí)現(xiàn)獲取字段屬性值,文中的示例代碼講解詳細(xì),具有很好的參考價(jià)值,希望對(duì)大家有所幫助
    2023-06-06
  • mybatis3使用@Select等注解實(shí)現(xiàn)增刪改查操作

    mybatis3使用@Select等注解實(shí)現(xiàn)增刪改查操作

    這篇文章主要介紹了mybatis3使用@Select等注解實(shí)現(xiàn)增刪改查操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-11-11
  • Java實(shí)現(xiàn)監(jiān)聽(tīng)文件變化的三種方案詳解

    Java實(shí)現(xiàn)監(jiān)聽(tīng)文件變化的三種方案詳解

    這篇文章主要介紹了Java實(shí)現(xiàn)監(jiān)聽(tīng)文件變化的三種方法,每種方案給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • 淺析Java中靜態(tài)代理和動(dòng)態(tài)代理的應(yīng)用與區(qū)別

    淺析Java中靜態(tài)代理和動(dòng)態(tài)代理的應(yīng)用與區(qū)別

    代理模式在我們生活中很常見(jiàn),而Java中常用的兩個(gè)的代理模式就是動(dòng)態(tài)代理與靜態(tài)代理,這篇文章主要為大家介紹了二者的應(yīng)用與區(qū)別,需要的可以參考下
    2023-08-08
  • 運(yùn)行java的class文件方法詳解

    運(yùn)行java的class文件方法詳解

    這篇文章主要詳細(xì)介紹了運(yùn)行java的class文件方法的相關(guān)資料,需要的朋友可以參考下
    2015-02-02
  • Java Quartz觸發(fā)器CronTriggerBean配置用法詳解

    Java Quartz觸發(fā)器CronTriggerBean配置用法詳解

    這篇文章主要介紹了Java Quartz觸發(fā)器CronTriggerBean配置用法詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • SpringBoot使用Apache?POI實(shí)現(xiàn)導(dǎo)入導(dǎo)出Excel文件

    SpringBoot使用Apache?POI實(shí)現(xiàn)導(dǎo)入導(dǎo)出Excel文件

    Apache?POI?是一個(gè)強(qiáng)大的?Java?庫(kù),用于處理?Microsoft?Office?文檔,下面我們來(lái)看看SpringBoot如何使用Apache?POI導(dǎo)入導(dǎo)出Excel文件功能吧
    2025-01-01
  • Java壓縮解壓縮工具類(lèi)

    Java壓縮解壓縮工具類(lèi)

    這篇文章主要為大家詳細(xì)介紹了Java壓縮解壓縮工具類(lèi),如何壓縮單個(gè)文件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • Java的云打印Lodop

    Java的云打印Lodop

    這篇文章主要介紹了Java的云打印Lodop 的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-07-07

最新評(píng)論