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

JAVA中的Launcher類解析

 更新時間:2023年09月11日 11:50:43   作者:feiyingHiei  
這篇文章主要介紹了JAVA中的Launcher類解析,Launcher作為JAVA應(yīng)用的入口,根據(jù)雙親委派模型,Laucher是由JVM創(chuàng)建的,它類加載器應(yīng)該是BootStrapClassLoader, 這是一個C++編寫的類加載器,是java應(yīng)用體系中最頂層的類加載器,需要的朋友可以參考下

一、ClassLoader

sun.misc.Launcher類是java的入口,在啟動java應(yīng)用的時候會首先創(chuàng)建Launcher類,創(chuàng)建Launcher類的時候回準(zhǔn)備應(yīng)用程序運(yùn)行中需要的類加載器。

Launcher作為JAVA應(yīng)用的入口,根據(jù)雙親委派模型,Laucher是由JVM創(chuàng)建的,它類加載器應(yīng)該是BootStrapClassLoader, 這是一個C++編寫的類加載器,是java應(yīng)用體系中最頂層的類加載器,負(fù)責(zé)加載JVM需要的一些類庫(<JAVA_HOME>/lib)??梢酝ㄟ^一個簡單的代碼驗(yàn)證一下我們的想法。

public class App {
    public static void main(String[] args) {
        ClassLoader classLoader = Launcher.class.getClassLoader();
    }
}

這里的classLoader是null,說明Launcher確實(shí)是BootstrapClassLoader加載的,那么我們就會非常好奇,ExtClassLoader是什么時候創(chuàng)建的呢?翻看一下Launcher的構(gòu)造器的代碼。

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

Launcher在創(chuàng)建的時候,第一件事情就是獲取ExtClassLoader, ExtClassLoader在JVM中是一個單例, 創(chuàng)建過程也是通過獲取環(huán)境變量來獲取ext加載的目錄,生成一個ExtClassLoader,ExtClassLoader是URLClassLoader的子類。

       public static Launcher.ExtClassLoader getExtClassLoader() throws IOException {
            if (instance == null) {
                Class clazz = Launcher.ExtClassLoader.class;
                synchronized(Launcher.ExtClassLoader.class) {
                    if (instance == null) {
                        instance = createExtClassLoader();
                    }
                }
            }
            return instance;
        }

在獲取ExtClassLoader之后,以此作為父類加載器創(chuàng)建一個 sun.misc.Launcher.AppClassLoader, AppClassLoader的加載路徑是java.class.path標(biāo)記的路徑,相同的,AppClassLoader也是URLClassLoader的子類。最終會將當(dāng)前線程的上下文類加載器設(shè)置為AppClassLoader。 通過上述分析,當(dāng)我們需要獲取當(dāng)前應(yīng)用程序的AppClassLoader或者ExtClassLoader的時候,可以直接使用Launcher來訪問。

public class App {
    public static void main(String[] args) {
        ClassLoader appClassLoader = Launcher.getLauncher().getClassLoader();
        ClassLoader extClassLoader = appClassLoader.getParent();
    }
}

二、Thread上下文ClassLoader的思考

java程序并不是一個單獨(dú)的可執(zhí)行文件,而是由一組.class文件組成。在應(yīng)用程序啟動的時候,并不是所有的類都會被加載,一個類被加載的時候會使用引用這個類的那個類的加載器來加載,也就是xxx.class.getClassLoader()。但是在日常使用的時候,還有一種是通過Thread的上限文獲取類加載器。

在java中為什么需要上下文類加載器呢,這個就是一個非常有意思的問題。 我們都知道java類加載的雙親委派模型,在加載一個類的時候,會優(yōu)先委派給父類加載器,這樣保證不會出現(xiàn)類被重復(fù)加載,也保證了java一些基礎(chǔ)類可以穩(wěn)定的存在,不會被用戶自定義類頂替掉。

雙親委派模型并不是完美的,在一些場景下會出現(xiàn)一些比較難解決的問題,舉個例子,在使用SPI的時候,ServiceLoader是通過BootStrap類加載器加載的,在執(zhí)行到加載用戶編寫的擴(kuò)展類的時候,如果使用當(dāng)前類的類加載器,是肯定無法加載到用戶編寫的類的,這個時候就無法繼續(xù)執(zhí)行了,所以這個時候就需要使用Thread的上下文類加載器,查看源碼的時候我們就發(fā)現(xiàn),在用戶不主動傳遞ClassLoader的時候,會獲取當(dāng)前上下文類加載器,這樣應(yīng)用程序才能正常的執(zhí)行。

    public static <S> ServiceLoader<S> load(Class<S> service) {
        ClassLoader cl = Thread.currentThread().getContextClassLoader();
        return ServiceLoader.load(service, cl);
    }

到此這篇關(guān)于JAVA中的Launcher類解析的文章就介紹到這了,更多相關(guān)JAVA的Launcher內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring中的@Configuration詳解

    Spring中的@Configuration詳解

    這篇文章主要介紹了Spring中的@Configuration詳解,Spring 提供了豐富的特性和功能,包括依賴注入、面向切面編程、事務(wù)管理、數(shù)據(jù)訪問、Web應(yīng)用程序開發(fā)等,需要的朋友可以參考下
    2023-08-08
  • 利用maven命令指定配置文件打包springboot項(xiàng)目

    利用maven命令指定配置文件打包springboot項(xiàng)目

    這篇文章主要介紹了利用maven命令指定配置文件打包springboot項(xiàng)目,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • 詳解IntelliJ IDEA 自定義方法注解模板

    詳解IntelliJ IDEA 自定義方法注解模板

    本篇文章主要介紹了IntelliJ IDEA 自定義方法注解模板,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • Java整數(shù)和字符串相互轉(zhuǎn)化實(shí)例詳解

    Java整數(shù)和字符串相互轉(zhuǎn)化實(shí)例詳解

    這篇文章主要介紹了Java整數(shù)和字符串相互轉(zhuǎn)化實(shí)例詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Java冒泡排序法和選擇排序法的實(shí)現(xiàn)

    Java冒泡排序法和選擇排序法的實(shí)現(xiàn)

    這篇文章主要介紹了Java冒泡排序法和選擇排序法的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Mybatis?大數(shù)據(jù)量批量寫優(yōu)化的案例詳解

    Mybatis?大數(shù)據(jù)量批量寫優(yōu)化的案例詳解

    這篇文章主要介紹了Mybatis?大數(shù)據(jù)量批量寫優(yōu)化的示例代碼,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-05-05
  • 解決Maven多模塊編譯慢的問題

    解決Maven多模塊編譯慢的問題

    這篇文章主要介紹了Maven多模塊編譯慢的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java 解析XML數(shù)據(jù)的4種方式

    Java 解析XML數(shù)據(jù)的4種方式

    這篇文章主要介紹了Java 解析XML數(shù)據(jù)的4種方式,幫助大家更好的用Java處理數(shù)據(jù),感興趣的朋友可以了解下
    2020-09-09
  • SpringBoot JdbcTemplate批量操作的示例代碼

    SpringBoot JdbcTemplate批量操作的示例代碼

    本篇文章主要介紹了SpringBoot JdbcTemplate批量操作的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • Java中的JetCache?實(shí)戰(zhàn)

    Java中的JetCache?實(shí)戰(zhàn)

    這篇文章主要介紹了Java中的JetCache實(shí)戰(zhàn),JetCache是一個基于Java的緩存系統(tǒng)封裝,提供統(tǒng)一的API和注解來簡化緩存的使用,下文更多相關(guān)資料需要的小伙伴可以參考一下
    2022-04-04

最新評論

灵石县| 河池市| 温泉县| 东兴市| 礼泉县| 孝义市| 永济市| 舒城县| 宜丰县| 井冈山市| 静宁县| 裕民县| 门头沟区| 曲沃县| 山阳县| 马尔康县| 堆龙德庆县| 宁远县| 得荣县| 县级市| 白银市| 阳原县| 宜良县| 吉安市| 阿拉善盟| 秀山| 汉寿县| 吕梁市| 阆中市| 永定县| 关岭| 紫金县| 法库县| 道孚县| 神池县| 鹤峰县| 松桃| 宿松县| 什邡市| 海门市| 西平县|