3分鐘瞭解Java雙親委派機制

你得先知道

在介紹雙親委派機制的時候,不得不提ClassLoader。說ClassLoader之前,我們得先了解下Java的基本知識。  
  Java是運行在Java的虛擬機(JVM)中的,但是它是怎麼就運行在JVM中了呢?我們在IDE中編寫的Java源代碼被編譯器編譯成.class的字節碼文件。然後由我們得ClassLoader負責將這些class問價加載到JVM中去執行。  
  JVM中提供了三層的ClassLoader:

  • Bootstrap classLoader:主要負責加載核心的類庫(java.lang.*等),構造ExtClassLoader和APPClassLoader。

  • ExtClassLoader:主要負責加載jre/lib/ext目錄下的一些擴展的jar。

  • AppClassLoader:主要負責加載應用程序的主函數類

    那如果有一個Hello.class文件是如何被加載到JVM中的呢?

雙親委派機制

我打開了我的AndroidStudio,搜索了下“ClassLoader”,然後打開“java.lang”包下的ClassLoader類。然後將代碼翻到loadClass方法:

    public Class<?> loadClass(String name) throws ClassNotFoundException {
        return loadClass(name, false);
    }
    //              -----????????-----
    protected Class<?> loadClass(String name, boolean resolve)
        throws ClassNotFoundException
    {
            // First, check if the class has already been loaded
            Class<?> c = findLoadedClass(name);
            if (c == null) {
                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.
                    c = findClass(name);
                }
            }
            return c;
    }

其實這段代碼已經很好的解釋了雙親委派機制,爲了大家更容易理解,我做了一張圖來描述一下上面一段代碼到底是怎麼做的:  

 
從上圖中我們就更容易理解了,當一個Hello.class這樣的文件要被加載時。不考慮我們自定義類加載器,首先會在AppClassLoader中檢查是否加載過,如果有那就無需再加載了。如果沒有,那麼會拿到父加載器,然後調用父加載器的loadClass方法。父類中同理會先檢查自己是否已經加載過,如果沒有再往上。注意這個過程,知道到達Bootstrap classLoader之前,都是沒有哪個加載器自己選擇加載的。如果父加載器無法加載,會下沉到子加載器去加載,一直到最底層,如果沒有任何加載器能加載,就會拋出ClassNotFoundException

爲什麼要設計這種機制

這種設計有個好處是,如果有人想替換系統級別的類:String.java。篡改它的實現,但是在這種機制下這些系統的類已經被Bootstrap classLoader加載過了,所以並不會再去加載,從一定程度上防止了危險代碼的植入。

如果對你有一點點的幫助,歡迎關注????????獲取更多知識哦~

發佈了60 篇原創文章 · 獲贊 13 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章