最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談一下Java的雙親委派模式

 更新時間:2023年04月27日 08:53:39   作者:索碼理  
這篇文章主要介紹了一下Java的雙親委派模式,雙親委派指得是,JVM在加載類時,會委派給ExtClassLoader和BootstrapClassLoader進(jìn)?加載,如果沒加載到才由??進(jìn)?加載,需要的朋友可以參考下

說起雙親委派模型,不得不說一下類加載器。

類加載器是什么?

當(dāng)我們編譯Java類時,JVM會創(chuàng)建與平臺和機(jī)器無關(guān)的字節(jié)碼。字節(jié)碼存儲在.class文件中。當(dāng)我們嘗試使用一個類時,類加載器就會把它加載到內(nèi)存中,然后把字節(jié)碼文件轉(zhuǎn)成Class對象。通俗的說類加載器就是將.class文件轉(zhuǎn)成Class對象的。

類加載器分類

啟動類加載器(Bootstrap Class Loader):負(fù)責(zé)加載存放在 <JAVA_HOME>\lib目錄下的類,或者被-Xbootclasspath參數(shù)所指定的路徑中存放的類。比如:rt.jar、java.lang.*包下的類。

擴(kuò)展類加載器(Extension Class Loader):負(fù)責(zé)加載<JAVA_HOME>\lib\ext目錄中,或者被java.ext.dirs系統(tǒng)變量所指定的路徑中所有的類庫。

應(yīng)用程序類加載器(Application Class Loader):負(fù)責(zé)加載用戶類路徑上所有的類庫。

雙親委派模型工作流程

當(dāng)類加載器收到加載類的請求時,它首先會把請求委派給父加載器去完成,每一層都如此,直到把請求委派給最頂層的啟動類加載器,只有當(dāng)父加載器無法加載委派過來的類時,子加載器才會加載。

JVM在加載?個類時,會調(diào)?AppClassLoader的loadClass?法來加載這個類,不過在這個?法中,會先使?ExtClassLoader的loadClass?法來加載類,同樣ExtClassLoader的loadClass?法中會先使?BootstrapClassLoader來加載類,如果BootstrapClassLoader加載到了就直接成功,如果 BootstrapClassLoader沒有加載到,那么ExtClassLoader就會??嘗試加載該類,如果沒有加載到,那么則會由AppClassLoader來加載這個類。

雙親委派模型

所以,雙親委派指得是,JVM在加載類時,會委派給ExtClassLoader和BootstrapClassLoader進(jìn)?加載,如果沒加載到才由??進(jìn)?加載。

這里說的雙親并不是說類加載器之間是以繼承方式實現(xiàn)的,而是以組合的方式實現(xiàn)的,通過源碼可以證實這點:

java.lang.ClassLoader#loadClass

private final ClassLoader parent;

protected Class<?> loadClass(String name, boolean resolve)
        throws ClassNotFoundException
    {
        synchronized (getClassLoadingLock(name)) {
            // First, check if the class has already been loaded
            Class<?> c = findLoadedClass(name);
            if (c == null) {
                long t0 = System.nanoTime();
                try {
                    if (parent != null) {
                        c = parent.loadClass(name, false);
                    } else {
                        c = findBootstrapClassOrNull(name);
                    }
                } catch (ClassNotFoundException e) {
                    // ClassNotFoundException thrown if class not found
                    // from the non-null parent class loader
                }

                if (c == null) {
                    // If still not found, then invoke findClass in order
                    // to find the class.
                    long t1 = System.nanoTime();
                    c = findClass(name);

                    // this is the defining class loader; record the stats
                    sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
                    sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
                    sun.misc.PerfCounter.getFindClasses().increment();
                }
            }
            if (resolve) {
                resolveClass(c);
            }
            return c;
        }
    }

同時,通過源碼我們也可以看到類加載器的加載流程是跟我們描述的一樣的:先檢查請求加載的類型是否已經(jīng)被加載過,若沒有則調(diào)用父加載器的loadClass()方法,若父加載器為空則默認(rèn)使用啟動類加載器作為父加載器。假如父類加載器加載失敗,拋出ClassNotFoundException異常的話,才調(diào)用自己的findClass()方法嘗試進(jìn)行加載。

雙親委派模型好處

保證唯一性,避免重復(fù)加載:類的加載隨著它的類加載器一起具備了層級關(guān)系,通過這種層級關(guān)系避免了重復(fù)加載,父類加載器加載了該類,子加載器就無需加載了。

避免核心類被篡改:核心類由啟動類加載器加載,即使用戶自定義同名核心類也不會被加載。

到此這篇關(guān)于淺談一下Java的雙親委派模式的文章就介紹到這了,更多相關(guān)java雙親委派模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • spring?boot項目自定義參數(shù)校驗規(guī)則示例詳解

    spring?boot項目自定義參數(shù)校驗規(guī)則示例詳解

    這篇文章主要介紹了spring boot項目如何自定義參數(shù)校驗規(guī)則,自定義校驗規(guī)則和自帶的規(guī)則實現(xiàn)方式一樣,先自定義一個注解,然后指定校驗類,在校驗類里實現(xiàn)具體的校驗規(guī)則,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • HttpServletRequest對象方法的用法小結(jié)

    HttpServletRequest對象方法的用法小結(jié)

    HttpServletRequest對象代表客戶端的請求,當(dāng)客戶端通過HTTP協(xié)議訪問服務(wù)器時,HTTP請求頭中的所有信息都封裝在這個對象中,開發(fā)人員通過這個對象的相關(guān)方法,即可以獲得客戶的這些信息
    2017-03-03
  • java之使用stream對日期排序方式

    java之使用stream對日期排序方式

    這篇文章主要介紹了java之使用stream對日期排序方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • springMVC獲取請求參數(shù)的幾種方式匯總

    springMVC獲取請求參數(shù)的幾種方式匯總

    在日常使用SpringMVC進(jìn)行開發(fā)的時候,有可能遇到前端各種類型的請求參數(shù),這里做一次相對全面的總結(jié),下面這篇文章主要給大家介紹了關(guān)于springMVC獲取請求參數(shù)的幾種方式,需要的朋友可以參考下
    2022-04-04
  • Java Excel文件加密保護(hù)數(shù)據(jù)安全

    Java Excel文件加密保護(hù)數(shù)據(jù)安全

    這篇文章主要為大家介紹了Java Excel文件加密保護(hù)數(shù)據(jù)安全的方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • 詳解JAVA 時間處理相關(guān)類

    詳解JAVA 時間處理相關(guān)類

    這篇文章主要介紹了JAVA 時間處理相關(guān)類的知識,文中示例代碼非常詳細(xì),供大家參考和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • Java讀取Excel文件內(nèi)容的簡單實例

    Java讀取Excel文件內(nèi)容的簡單實例

    這篇文章主要介紹了Java讀取Excel文件內(nèi)容的簡單實例,有需要的朋友可以參考一下
    2013-11-11
  • 全網(wǎng)最精細(xì)詳解二叉樹,2萬字帶你進(jìn)入算法領(lǐng)域

    全網(wǎng)最精細(xì)詳解二叉樹,2萬字帶你進(jìn)入算法領(lǐng)域

    大家好,我是哪吒,一個熱愛編碼的Java工程師,本著"欲速則不達(dá),欲達(dá)則欲速"的學(xué)習(xí)態(tài)度,在程序猿這條不歸路上不斷成長,所謂成長,不過是用時間慢慢擦亮你的眼睛,少時看重的,年長后卻視若鴻毛,少時看輕的,年長后卻視若泰山,成長之路,亦是漸漸放下執(zhí)念,內(nèi)心歸于平靜的旅程
    2021-08-08
  • mybatis 為什么千萬不要使用 where 1=1

    mybatis 為什么千萬不要使用 where 1=1

    這篇文章主要介紹了mybatis 為什么千萬不要使用 where 1=1,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • spring是如何實現(xiàn)聲明式事務(wù)的

    spring是如何實現(xiàn)聲明式事務(wù)的

    這篇文章主要介紹了spring是如何實現(xiàn)聲明式事務(wù)的,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04

最新評論

军事| 始兴县| 甘南县| 宜春市| 永年县| 海安县| 铜陵市| 金华市| 县级市| 即墨市| 郑州市| 洮南市| 麻阳| 长乐市| 固安县| 台前县| 昆山市| 锡林郭勒盟| 巨鹿县| 纳雍县| 博野县| 自治县| 平湖市| 洱源县| 漯河市| 甘孜县| 色达县| 濉溪县| 麦盖提县| 翁牛特旗| 弥勒县| 亳州市| 城口县| 琼结县| 五台县| 湘潭市| 蕉岭县| 隆回县| 宜兰市| 辰溪县| 观塘区|