天天看點

深入了解java虛拟機---雙親委派模型

雙親委派模型是java類加載器所使用的模型.

雙親委派模型的工作過程:如果一個類加載器收到了類加載器的請求.它首先不會自己去嘗試加載這個類.而是把這個請求委派給父加載器去完成.每個層次的類加載器都是如此.

是以所有的加載請求最終都會傳送到Bootstrap類加載器(啟動類加載器)中.隻有父類加載回報自己無法加載這個請求(它的搜尋範圍中沒有找到所需的類)時.子加載器才會嘗試自

己去加載.

雙親委派模型執行流程:

深入了解java虛拟機---雙親委派模型

雙親委派模型的好處:java類随着它的加載器一起具備了一種帶有優先級的層次關系.

例如類java.lang.Object,它存放在rt.jart之中.無論哪一個類加載器都要加載這個類.最終都是雙親委派模型最頂端的Bootstrap類加載器去加載.是以Object類在程式的各種類加載器環境中都是同一個類.相反.如果沒有使用雙親委派模型.由各個類加載器自行去加載的話.如果使用者編寫了一個稱為“java.lang.Object”的類.并存放在程式的ClassPath中.那系統中将會出現多個不同的Object類.java類型體系中最基礎的行為也就無法保證.應用程式也将會一片混亂.

雙親委派的代碼實作(在ClassLoader類中的loadClass中):

protected synchronized Class<?> loadClass(String name,boolean resolve)throws ClassNotFoundException

{

        Class c = findLoadedClass(name);

        if(c==null)

        {

            try

            {

                if(parent!=null)

                {

                    c = parent.loadClass(name,false);

                }

                else

                {

                    c = findBootstrapClassOrNull(name);

                }

            }

            catch(ClassNotFoundException e)

            {

            }

            if(c==null)

            {

                c = findClass(name);

            }

        }

        if(resolve)

        {

            resolveClass(c);

        }

        return c;

}

邏輯:先檢查是否已經被加載過.若沒有加載則調用父加載器的loadClass()方法.若父加載器為空則預設使用Bootstrap類加載器作為父加載器.若父加載失敗.抛出ClassNotFoundException異常後再調用自己的findClass()方法進行加載...