欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android類(lèi)加載ClassLoader雙親委托機(jī)制詳解

 更新時(shí)間:2023年07月07日 11:18:14   作者:載漁之洲  
這篇文章主要為大家介紹了Android類(lèi)加載ClassLoader雙親委托機(jī)制詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

一、ClassLoader類(lèi)圖關(guān)系

ClassLoader、BootClassLoader、BaseDexClassLoader等之間關(guān)系,如下如:

二、雙親委托機(jī)制

1、定義

如果某個(gè)類(lèi)加載器在加載類(lèi)時(shí),先不會(huì)自己去嘗試加載這個(gè)類(lèi),而是首將加載任務(wù)委托給父類(lèi)加載器,依次遞歸,如果父類(lèi)加載器可以完成類(lèi)加載任務(wù),就成功返回;只有父類(lèi)加載器無(wú)法完成此加載任務(wù)或者沒(méi)有父類(lèi)加載器時(shí),才會(huì)交給自己嘗試加載。

如:可以看到創(chuàng)建 ClassLoader 需要接收一個(gè) ClassLoader parent 參數(shù)。這個(gè) parent 的目的就在于實(shí)現(xiàn)類(lèi)加載的雙親委托

protected Class<?> loadClass(String name, boolean resolve)
        throws ClassNotFoundException
    {
            // First, check if the class has already been loaded
            // 檢查class是否有被加載
            Class<?> c = findLoadedClass(name);
            if (c == null) {
                try {
                    if (parent != null) {
                        //如果parent不為null,則調(diào)用parent的loadClass進(jìn)行加載
                        c = parent.loadClass(name, false);
                    } else {
                        //parent為null,則調(diào)用BootClassLoader進(jìn)行加載
                        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. 
                    // 如果都找不到就自己查找
                    c = findClass(name);
                }
            }
            return c;
    }

2、雙親作用

1)、避免重復(fù)加載,當(dāng)父加載器已經(jīng)加載了該類(lèi)的時(shí)候,就沒(méi)有必要子ClassLoader再加載一次。

2)、安全性考慮,防止核心API庫(kù)被隨意篡改。

以上就是Android類(lèi)加載ClassLoader的詳細(xì)內(nèi)容,更多關(guān)于Android類(lèi)加載ClassLoader的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論