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

ClassLoader雙親委派模式作用詳解

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

前言

我們的面試中經常會遇到關于ClassLoader的問題,但是我們的日常開發(fā)中又沒有直接編寫過ClassLoader相關的代碼。對于小白新手來說,可能都不知道ClassLoader是用來干嘛的,它是如何在無形當中影響我們編寫的代碼的?

ClassLoader的作用

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

ClassLoader的種類

在JDK中,默認是有三種ClassLoader的:

Bootstrap ClassLoader

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

Extension ClassLoader

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

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

AppClassLoader

加載當前應用classpath下的所有class文件;

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

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

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對象;

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

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

為什么沒有提到BoostrapClassLoader?

因為BoostrapClassLoader在java層面是拿不到的,ExtClassLoader的父級ClassLoader就是BoostrapClassLoader,java層面取出來就是null;

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

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

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

1.先在當前ClassLoader檢查是否已經加載了目標類;

2.如果當前ClassLoader沒有加載目標類,那么先向嘗試讓父級ClassLoader加載目標類,直至BootstrapClassLoader;

3.如果最終所有的父級ClassLoader都沒有加載目標類,那么當前ClassLoader嘗試自己加載目標類;

4.所有父級ClassLoader重復操作1~3步驟;

5.只要其中任意一個ClassLoader成功加載目標類,那么就直接返回;

小測試

為了驗證小伙伴們是否已經明白了雙親委派模式,我們出一個小小的測試題留給大家:

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

以上就是ClassLoader雙親委派模式作用詳解的詳細內容,更多關于ClassLoader雙親委派模式的資料請關注腳本之家其它相關文章!

相關文章

  • SpringBoot+MyBatis簡單數(shù)據(jù)訪問應用的實例代碼

    SpringBoot+MyBatis簡單數(shù)據(jù)訪問應用的實例代碼

    這篇文章主要介紹了SpringBoot+MyBatis簡單數(shù)據(jù)訪問應用的實例代碼,需要的朋友可以參考下
    2017-05-05
  • Java web xml文件讀取解析方式

    Java web xml文件讀取解析方式

    這篇文章主要介紹了Java web xml文件讀取解析方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • Java線程中斷的本質深入理解

    Java線程中斷的本質深入理解

    Java的中斷是一種協(xié)作機制。也就是說調用線程對象的interrupt方法并不一定就中斷了正在運行的線程,它只是要求線程自己在合適的時機中斷自己,本文將詳細介紹,需要了解的朋友可以參考下
    2012-12-12
  • 功能強大的TraceId?搭配?ELK使用詳解

    功能強大的TraceId?搭配?ELK使用詳解

    這篇文章主要為大家介紹了功能強大的TraceId?搭配?ELK使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • 掃二維碼自動跳轉【java】詳解

    掃二維碼自動跳轉【java】詳解

    這篇文章主要介紹了java掃二維碼自動跳轉,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-05-05
  • java中JDBC實現(xiàn)往MySQL插入百萬級數(shù)據(jù)的實例代碼

    java中JDBC實現(xiàn)往MySQL插入百萬級數(shù)據(jù)的實例代碼

    這篇文章主要介紹了java中JDBC實現(xiàn)往MySQL插入百萬級數(shù)據(jù)的實例代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-01-01
  • Java中的接口知識匯總

    Java中的接口知識匯總

    本文給大家匯總介紹了在java中的接口知識,包括為什么要使用接口、什么是接口、抽象類和接口的區(qū)別、如何定義接口以及定義接口注意點,希望大家能夠喜歡
    2016-04-04
  • Java操作pdf文件的方法大全

    Java操作pdf文件的方法大全

    這篇文章主要為大家詳細介紹了Java操作pdf文件的相關知識,例如合并pdf文件,手繪pdf文件以及導出PDF文件等,有需要的小伙伴可以參考一下
    2024-04-04
  • 使用 Spring Boot 2.0 + WebFlux 實現(xiàn) RESTful API功能

    使用 Spring Boot 2.0 + WebFlux 實現(xiàn) RESTful API功能

    什么是 Spring WebFlux, 它是一種異步的, 非阻塞的, 支持背壓(Back pressure)機制的Web 開發(fā)框架.下面通過本文給大家介紹使用 Spring Boot 2.0 + WebFlux 實現(xiàn) RESTful API功能,需要的朋友參考下吧
    2018-01-01
  • Springboot項目刪除項目同步target文件問題解決方案

    Springboot項目刪除項目同步target文件問題解決方案

    這篇文章主要介紹了Springboot項目刪除項目同步target文件問題解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-12-12

最新評論

裕民县| 平潭县| 澎湖县| 衡东县| 沙坪坝区| 新营市| 临潭县| 遂平县| 宝鸡市| 利辛县| 大石桥市| 洛隆县| 浮梁县| 绥德县| 营口市| 邵东县| 舟山市| 冕宁县| 大埔区| 延吉市| 洪江市| 衡东县| 望江县| 钟祥市| 南汇区| 苏尼特左旗| 珲春市| 扎兰屯市| 平顶山市| 确山县| 大连市| 呼图壁县| 和田县| 吴川市| 高邑县| 教育| 宕昌县| 磐安县| 抚顺县| 驻马店市| 辛集市|