真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

什么是類加載機(jī)制

本篇內(nèi)容主要講解“什么是類加載機(jī)制”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“什么是類加載機(jī)制”吧!

創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司,專注做網(wǎng)站、網(wǎng)站制作、網(wǎng)站營(yíng)銷推廣,國(guó)際域名空間,網(wǎng)站空間,成都網(wǎng)站托管有關(guān)企業(yè)網(wǎng)站制作方案、改版、費(fèi)用等問(wèn)題,請(qǐng)聯(lián)系創(chuàng)新互聯(lián)。

類記載過(guò)程

多個(gè)java文件經(jīng)過(guò)編譯打包生成可運(yùn)行的jar包,最終由java命令運(yùn)行某個(gè)主類的main函數(shù)啟動(dòng)程序,這里首先需要通過(guò)類加載器把主類加載到j(luò)vm。 主類在運(yùn)行過(guò)程中如果使用到其他類,會(huì)逐步加載這些類。 注意,jar包里的類不是一次性全部加載的,是使用時(shí)才加載的。

從類加載到使用整個(gè)過(guò)程由如下幾步: 加載、驗(yàn)證、準(zhǔn)備、解析、初始化、使用、卸載

  • 加載:在硬盤(pán)上查找并通過(guò)IO讀入字節(jié)碼文件,使用到類時(shí)才會(huì)加載,例如:調(diào)用類的main方法,new對(duì)象等;

  • 驗(yàn)證:校驗(yàn)字節(jié)碼文件的正確性;

  • 準(zhǔn)備:給類的靜態(tài)變量分配內(nèi)存,并賦予默認(rèn)值;

  • 解析:將符號(hào)引用替換為直接引用,該階段會(huì)把一些靜態(tài)方法(符號(hào)引用,比如main方法)替換為指向數(shù)據(jù)所在內(nèi)存的指針或句柄等(直接引用),這就是靜態(tài)鏈接過(guò)程,這個(gè)過(guò)程是在類記載期間完成的。動(dòng)態(tài)鏈接是程序運(yùn)行期間完成的將符號(hào)引用替換為直接引用。

  • 初始化:對(duì)類的靜態(tài)變量初始化為指定的值,執(zhí)行靜態(tài)代碼塊。 什么是類加載機(jī)制

類加載器

上面的類加載過(guò)程主要是通過(guò)類加載器來(lái)實(shí)現(xiàn)的,java里有以下幾種類加載器。

  • 啟動(dòng)類加載器:負(fù)責(zé)加載支撐JVM運(yùn)行的位于JREd額lib目錄下的核心類庫(kù);

  • 擴(kuò)展類加載器:負(fù)責(zé)加載支撐JVM運(yùn)行位于JRE的lib目錄下的ext擴(kuò)展目錄中的JAR類包;

  • 應(yīng)用程序加載器:負(fù)責(zé)加載ClassPath路徑下的類包,主要就是加載應(yīng)用程序的類;

  • 自定義加載器:負(fù)責(zé)加載用戶自定義路徑下的類包;

類記載器繼承了java.lang.ClassLoader類,該類有兩個(gè)核心方法,loadClass和findClass。

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;
    }
}

findClass方法默認(rèn)實(shí)現(xiàn)是拋出異常,所以我們?cè)谧远x類加載器主要是重寫(xiě)findClass方法。

protected Class findClass(String name) throws ClassNotFoundException {
    throw new ClassNotFoundException(name);
}

雙親委派機(jī)制

jvm類加載器是有親子層結(jié)構(gòu)的.

什么是類加載機(jī)制

這里類加載就是雙親委派機(jī)制,記載某個(gè)類時(shí), 會(huì)先委托父加載器尋找目標(biāo)類,找不到再委托上層父加載器加載,如果所有父加載器再自己的加載類路徑下都找不到目標(biāo)類,則再自己的類加載路徑中查找并載入目標(biāo)類。

比如:Math類,最先會(huì)找應(yīng)用程序類加載器加載,應(yīng)用程序加載器會(huì)先委托擴(kuò)展類加載器加載,擴(kuò)展類加載器再委托啟動(dòng)類加載器,頂層啟動(dòng)類加載器在自己的類加載器路徑里找了半天沒(méi)找到Math類,則向下退回加載Math類的請(qǐng)求,擴(kuò)展類加載器收到回復(fù)就自己加載,在自己的類加載路徑里找了半天也沒(méi)找到Math類,又向下退回Math類的加載請(qǐng)求給應(yīng)用程序類加載器,應(yīng)用程序類加載器于是在自己的類加載路徑中找到了Math類,于是就自己加載了。

雙親委派機(jī)制說(shuō)簡(jiǎn)單就是:先找父親加載,不行再由父親自己加載。

到此,相信大家對(duì)“什么是類加載機(jī)制”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!


分享題目:什么是類加載機(jī)制
網(wǎng)址分享:http://weahome.cn/article/jhjjdo.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部