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

ClassLoader雙親委派模式作用詳解

 更新時(shí)間:2022年10月28日 10:27:04   作者:夢(mèng)想實(shí)現(xiàn)家_Z  
這篇文章主要為大家介紹了ClassLoader雙親委派模式作用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

前言

我們的面試中經(jīng)常會(huì)遇到關(guān)于ClassLoader的問(wèn)題,但是我們的日常開(kāi)發(fā)中又沒(méi)有直接編寫過(guò)ClassLoader相關(guān)的代碼。對(duì)于小白新手來(lái)說(shuō),可能都不知道ClassLoader是用來(lái)干嘛的,它是如何在無(wú)形當(dāng)中影響我們編寫的代碼的?

ClassLoader的作用

見(jiàn)名知意,ClassLoader就是類加載器,它的作用就是將我們編寫的java代碼加載到JVM虛擬機(jī)中。在JVM啟動(dòng)的時(shí)候是不會(huì)一次性把所有的java類加載進(jìn)去的,而是在需要的時(shí)候才加載指定的類文件,要不然類特別多的話,大部分類一時(shí)用不上,那就浪費(fèi)內(nèi)存資源了。既然ClassLoader是用來(lái)加載類文件的,那么我們平時(shí)寫的java代碼是如何加載的呢?

ClassLoader的種類

在JDK中,默認(rèn)是有三種ClassLoader的:

Bootstrap ClassLoader

主要加載核心類庫(kù),加載${JRE_HOME}/lib下的rt.jar、resources.jar等;

Extension ClassLoader

加載擴(kuò)展類庫(kù),加載${JRE_HOME}/lib/ext文件夾下的jar包和class文件;

另外還會(huì)加載-D java.ext.dirs指定的目錄下的jar包和class文件;

AppClassLoader

加載當(dāng)前應(yīng)用classpath下的所有class文件;

如何實(shí)現(xiàn)雙親委派模式

Launcher類中,我們可以看到Launcher創(chuàng)建的時(shí)候,同時(shí)創(chuàng)建了ExrClassLoaderAppClassLoader對(duì)象。

sun.misc.Launcher:

    public Launcher() {
        Launcher.ExtClassLoader var1;
        try {
            var1 = Launcher.ExtClassLoader.getExtClassLoader();
        } catch (IOException var10) {
            throw new InternalError("Could not create extension class loader", var10);
        }
        try {
            this.loader = Launcher.AppClassLoader.getAppClassLoader(var1);
        } catch (IOException var9) {
            throw new InternalError("Could not create application class loader", var9);
        }
        Thread.currentThread().setContextClassLoader(this.loader);
    }

1.創(chuàng)建ExtClassLoader對(duì)象;

2.創(chuàng)建AppClassLoader對(duì)象,并把ExtClassLoader對(duì)象作為AppClassLoader的父級(jí)ClassLoader;

3.把AppClassLoader對(duì)象綁定到線程上下文中;

為什么沒(méi)有提到BoostrapClassLoader?

因?yàn)锽oostrapClassLoader在java層面是拿不到的,ExtClassLoader的父級(jí)ClassLoader就是BoostrapClassLoader,java層面取出來(lái)就是null;

為了了解清楚類的加載方式,我們首先需要從AppClassLoader中的loadClass()方法中入手:

protected Class<?> loadClass(String name, boolean resolve)
        throws ClassNotFoundException
    {
        synchronized (getClassLoadingLock(name)) {
            // 首先, 檢查這個(gè)類是否已經(jīng)加載好了
            Class<?> c = findLoadedClass(name);
            // 如果沒(méi)有加載過(guò)
            if (c == null) {
                long t0 = System.nanoTime();
                try {
                    // 如果父級(jí)ClassLoader不為空,那么就先嘗試讓父級(jí)ClassLoader加載
                    if (parent != null) {
                        c = parent.loadClass(name, false);
                    } else {
                        // 如果父級(jí)ClassLoader為空,有可能父級(jí)ClassLoader是BootstrapClassLoader,那么先嘗試在BootstrapClassLoader加載
                        c = findBootstrapClassOrNull(name);
                    }
                } catch (ClassNotFoundException e) {
                    // ClassNotFoundException thrown if class not found
                    // from the non-null parent class loader
                }
                // 如果一直向上都沒(méi)有加載目標(biāo)class,那么最終回到當(dāng)前ClassLoader加載
                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;
        }
    }

通過(guò)以上代碼分析,我們可以大概了解到雙親委派模式了:

1.先在當(dāng)前ClassLoader檢查是否已經(jīng)加載了目標(biāo)類;

2.如果當(dāng)前ClassLoader沒(méi)有加載目標(biāo)類,那么先向嘗試讓父級(jí)ClassLoader加載目標(biāo)類,直至BootstrapClassLoader;

3.如果最終所有的父級(jí)ClassLoader都沒(méi)有加載目標(biāo)類,那么當(dāng)前ClassLoader嘗試自己加載目標(biāo)類;

4.所有父級(jí)ClassLoader重復(fù)操作1~3步驟;

5.只要其中任意一個(gè)ClassLoader成功加載目標(biāo)類,那么就直接返回;

小測(cè)試

為了驗(yàn)證小伙伴們是否已經(jīng)明白了雙親委派模式,我們出一個(gè)小小的測(cè)試題留給大家:

我們通過(guò)自己創(chuàng)建一個(gè)java.lang.String的類(類名和包名和JDK中的String.class一致),這個(gè)自定義的String類能不能通過(guò)AppClassLoader成功地加載到JVM中?

以上就是ClassLoader雙親委派模式作用詳解的詳細(xì)內(nèi)容,更多關(guān)于ClassLoader雙親委派模式的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java通過(guò)賣票理解多線程

    Java通過(guò)賣票理解多線程

    本文主要介紹了一個(gè)多線程賣票的例子,通過(guò)賣票這個(gè)實(shí)例來(lái)介紹多線程的方式,加深理解,需要的朋友可以參考下
    2017-09-09
  • Java如何跳過(guò)https的ssl證書(shū)驗(yàn)證詳解

    Java如何跳過(guò)https的ssl證書(shū)驗(yàn)證詳解

    這篇文章主要介紹了Java跳過(guò)https的ssl證書(shū)驗(yàn)證的解決思路,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,下面我們來(lái)深入學(xué)習(xí)下吧
    2019-06-06
  • 運(yùn)用springboot搭建并部署web項(xiàng)目的示例

    運(yùn)用springboot搭建并部署web項(xiàng)目的示例

    這篇文章主要介紹了運(yùn)用springboot搭建并部署web項(xiàng)目的示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06
  • 使用Java如何對(duì)復(fù)雜的數(shù)據(jù)類型排序和比大小

    使用Java如何對(duì)復(fù)雜的數(shù)據(jù)類型排序和比大小

    我相信大家在第一次接觸算法的時(shí)候,最先接觸的肯定也是從排序算法開(kāi)始的,下面這篇文章主要給大家介紹了關(guān)于使用Java如何對(duì)復(fù)雜的數(shù)據(jù)類型排序和比大小的相關(guān)資料,需要的朋友可以參考下
    2023-12-12
  • Java實(shí)現(xiàn)創(chuàng)建運(yùn)行時(shí)類的對(duì)象操作示例

    Java實(shí)現(xiàn)創(chuàng)建運(yùn)行時(shí)類的對(duì)象操作示例

    這篇文章主要介紹了Java實(shí)現(xiàn)創(chuàng)建運(yùn)行時(shí)類的對(duì)象操作,結(jié)合實(shí)例形式分析了Java動(dòng)態(tài)創(chuàng)建對(duì)象的原理與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2018-08-08
  • Proxy實(shí)現(xiàn)AOP切面編程案例

    Proxy實(shí)現(xiàn)AOP切面編程案例

    這篇文章主要介紹了Proxy實(shí)現(xiàn)AOP切面編程案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08
  • Java IO之字節(jié)輸入輸出流詳解

    Java IO之字節(jié)輸入輸出流詳解

    這篇文章主要為大家介紹了Java IO之字節(jié)輸入輸出流,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-01-01
  • JAVA中l(wèi)ist,set,數(shù)組之間的轉(zhuǎn)換詳解

    JAVA中l(wèi)ist,set,數(shù)組之間的轉(zhuǎn)換詳解

    以下是對(duì)JAVA中l(wèi)ist,set,數(shù)組之間的轉(zhuǎn)換進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下
    2013-09-09
  • 源碼解析JDK 1.8 中的 Map.merge()

    源碼解析JDK 1.8 中的 Map.merge()

    這篇文章主要介紹了JDK 1.8 之 Map.merge()的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-10-10
  • Java源碼解析之TypeVariable詳解

    Java源碼解析之TypeVariable詳解

    這篇文章主要介紹了Java源碼解析之TypeVariable詳解,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-10-10

最新評(píng)論