Java程式員從笨鳥到菜鳥之(九十八)深入java虛擬機器(七)深入源碼看java類載入器ClassLoader

來源:互聯網
上載者:User

      歡迎閱讀本專題的其他部落格:


                  
  深入java虛擬機器(一)——java虛擬機器底層結構詳解

                         深入java虛擬機器(二)——類的生命週期(上)類的載入和串連

                         深入java虛擬機器(三)——類的生命週期(下)類的初始化

                         深入java虛擬機器(四)——java虛擬機器的記憶體回收機制

                         深入java虛擬機器(五)——java本地介面JNI詳解

                         深入java虛擬機器(六)——類載入的父親委託機制



         ClassLoader類載入器是負責載入類的對象。ClassLoader 類是一個抽象類別。如果給定類的二進位名稱(即為包名加類名的全稱),那麼類載入器會試圖尋找或產生構成類定義的資料。一般策略是將名稱轉換為某個檔案名稱,然後從檔案系統讀取該名稱的“類檔案”。java.lang.ClassLoader類的基本職責就是根據一個指定的類的名稱,找到或者產生其對應的位元組代碼,然後從這些位元組代碼中定義出一個 Java 類,即 java.lang.Class類的一個執行個體。除此之外,ClassLoader還負責載入 Java 應用所需的資源,像檔案和設定檔等。 作為所有類載入器的基類,ClassLoader的內部實現機制還是值得我們細細研究一下的。所以今天我就帶領大家一起來看一下Classloader的內部實現源碼。


首先我們來看一下Classloader類的兩個構造方法。

             


        從上邊的協助文檔中我們可以發現,在建立一個classloader的執行個體時我們可以顯示的指出他的父載入器,也可以不指定,不指定的時候他的預設的父載入器是系統載入器。我們來看一下源碼的實現:

   

 /**     * Creates a new class loader using the <tt>ClassLoader</tt> returned by     * the method {@link #getSystemClassLoader()     * <tt>getSystemClassLoader()</tt>} as the parent class loader.          */    protected ClassLoader() {SecurityManager security = System.getSecurityManager();if (security != null) {    security.checkCreateClassLoader();}this.parent = getSystemClassLoader();initialized = true;}
    /**     * Creates a new class loader using the specified parent class loader for     */    protected ClassLoader(ClassLoader parent) {SecurityManager security = System.getSecurityManager();if (security != null) {    security.checkCreateClassLoader();}this.parent = parent;initialized = true;    } 


      從上面源碼我們可以發現,classloader中一定有一個parent的屬性來指定當前loader的附加器。其源碼也證明了我們剛才上面的說法。

     看完構造方法的實現,下一步我們來看一下ClassLoader中一個特別重要的方法loadclass方法,這個方法就是用來載入類的。這個方法在jdk中有個重載的方法,但是其實是一個樣的。一個帶有是否連結類的方法,一個不帶。下面我們就看一下這個方法的源碼:


public Class<?> loadClass(String name) throws ClassNotFoundException {return loadClass(name, false);    }    /**     * Loads the class with the specified <a href="#name">binary name</a>.  The     * default implementation of this method searches for classes in the          * @throws  ClassNotFoundException     *          If the class could not be found     */    protected synchronized Class<?> loadClass(String name, boolean resolve)throws ClassNotFoundException    {// First, check if the class has already been loadedClass c = findLoadedClass(name);if (c == null) {    try {if (parent != null) {    c = parent.loadClass(name, false);} else {    c = findBootstrapClass0(name);}    } catch (ClassNotFoundException e) {        // If still not found, then invoke findClass in order        // to find the class.        c = findClass(name);    }}if (resolve) {    resolveClass(c);}return c;    }

關於這個方法的源碼解釋,我感覺我沒必要解釋什麼,因為在API中已經有詳細的解釋了。我在解釋肯定也不如他解釋的好,所以我們來看一下API是怎麼解釋的吧:



        雖然jdk已經解釋的很清楚了,但是有一點我還是要在補充一下。從上面的源碼我們可以看出loadClass方法是一個遞迴的方法,一直往上找,一直找到根類載入器為止,然後讓類載入器去載入這個類。至於跟載入器是怎麼實現的我們就不得而知了。因為跟類載入載入類時一個本地方法,他是用c++寫的。我們無法看到他的源碼。這樣驗證了在前面我們所說的類載入器的父類委託機制。


下面我們來看一下findClass方法,我們在上面的代碼中發現。在loadClass方法中有調用這個findclass方法,下面我們首先來看一下API對這個方法的介紹:


       從上面介紹我們可以看出,這個方法主要是來尋找我們的類檔案的。我們在自訂我們自己的類載入器的時候應該重寫這個方法,因為jdk中對這個方法基本沒有實現什麼,這就需要我們自己來重寫這個方法,用我們自己的所定義的方法去尋找類檔案。不信。你可以看一下他的源碼實現:


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

暫時先介紹這些吧。其他的方法基本都差不多,最近感覺部落格越來越難寫,越來越吃力。越來越發現底層理論的缺乏。希望通過自己的努力,可以慢慢改變這個現狀。


------------------------------------------------------------------------------------------------------------

《Java程式員由笨鳥到菜鳥》電子版書正式發布,歡迎大家下載

http://blog.csdn.net/csh624366188/article/details/7999247



相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.