ClassLoader學(xué)習(xí)

JVM 類加載器常用的三種方式

1. 默認(rèn)方式 之雙親委托模式

JVM默認(rèn)的三種加載器

子類加載器在加載一個(gè)類時(shí),會(huì)讓父類先加載。如果父類已經(jīng)加載了的時(shí)候,沒(méi)有必要讓子類再加載一次。

protected Class<?> loadClass(String name, boolean resolve)
        throws ClassNotFoundException
    {
        synchronized (getClassLoadingLock(name)) {
            // 首先,檢查從JVM緩存查找該類
            Class<?> c = findLoadedClass(name);
            if (c == null) {
                long t0 = System.nanoTime();
                try {
                    if (parent != null) { // 然后委托給父類加載器進(jìn)行加載
                        c = parent.loadClass(name, false);
                    } else { // 如果父類加載器為null, 則委托給Bootstrap類加載器加載
                        c = findBootstrapClassOrNull(name);
                    }
                } catch (ClassNotFoundException e) {
                    // ClassNotFoundException thrown if class not found
                    // from the non-null parent class loader
                }

                if (c == null) {
                    // 如果仍然沒(méi)有找到,則調(diào)用findClass()進(jìn)行查找 
                    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;
        }
    }

從以上代碼可知,實(shí)現(xiàn)自己的類加載策略可以覆蓋ClassLoader的findClass() 或者loadClass()方法來(lái)實(shí)現(xiàn)。

2. 父類加載器加載子類加載器中的資源

如果一個(gè)類引用了另一個(gè)類,那么被引用的類應(yīng)該有引用方類加載器加載。

通過(guò)設(shè)置和獲取線程上下文類加載器ContextClassLoader實(shí)現(xiàn)

    ClassLoader extClassLoader =   MyContextClassLoad.class.getClassLoader().getParent();
    Thread.currentThread().setContextClassLoader(extClassLoader);

3. 類加載器要使用不在當(dāng)前類加載器查找路徑的類

新建一個(gè)在指定路徑查找類的類加載器

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容