java中類的載入機制

來源:互聯網
上載者:User

1.類的載入過程  

JVM將類載入過程分為三個步驟:裝載(Load),連結(Link)和初始化(Initialize)連結又分為三個步驟,如所示:

1) 裝載:尋找並載入類的位元據;

2)連結:

驗證:確保被載入類的正確性;

準備:為類的靜態變數分配記憶體,並將其初始化為預設值;

解析:把類中的符號引用轉換為直接引用;

3)初始化:為類的靜態變數賦予正確的初始值;

          那為什麼我要有驗證這一步驟呢?首先如果由編譯器產生的class檔案,它肯定是符合JVM位元組碼格式的,但是萬一有高手自己寫一個class檔案,讓JVM載入並運行,用於惡意用途,就不妙了,因此這個class檔案要先過驗證這一關,不符合的話不會讓它繼續執行的,也是為了安全考慮吧。

        準備階段和初始化階段看似有點牟盾,其實是不牟盾的,如果類中有語句:private static int a = 10,它的執行過程是這樣的,首先位元組碼檔案被載入到記憶體後,先進行連結的驗證這一步驟,驗證通過後準備階段,給a分配記憶體,因為變數a是static的,所以此時a等於int類型的預設初始值0,即a=0,然後到解析(後面在說),到初始化這一步驟時,才把a的真正的值10賦給a,此時a=10。


2. 類的初始化

    類什麼時候才被初始化:

1)建立類的執行個體,也就是new一個對象

2)訪問某個類或介面的靜態變數,或者對該靜態變數賦值

3)調用類的靜態方法

4)反射(Class.forName("com.lyj.load"))

5)初始化一個類的子類(會首先初始化子類的父類)

6)JVM啟動時標明的啟動類,即檔案名稱和類名相同的那個類

         只有這6中情況才會導致類的類的初始化。

     類的初始化步驟:

        1)如果這個類還沒有被載入和連結,那先進行載入和連結

        2)假如這個類存在直接父類,並且這個類還沒有被初始化(注意:在一個類載入器中,類只能初始化一次),那就初始化直接的父類(不適用於介面)

         3)加入類中存在初始化語句(如static變數和static塊),那就依次執行這些初始化語句。


3.類的載入

       類的載入指的是將類的.class檔案中的位元據讀入到記憶體中,將其放在運行時資料區的方法區內,然後在堆區建立一個這個類的java.lang.Class對象,用來封裝類在方法區類的對象。看下面2圖



         類的載入的最終產品是位於堆區中的Class對象
        Class對象封裝了類在方法區內的資料結構,並且向Java程式員提供了存取方法區內的資料結構的介面

載入類的方式有以下幾種:

 1)從本地系統直接載入

2)通過網路下載.class檔案

3)從zip,jar等歸檔檔案中載入.class檔案

4)從專有資料庫中提取.class檔案

5)將Java源檔案動態編譯為.class檔案(伺服器)


4.載入器

來自http://blog.csdn.net/cutesource/article/details/5904501

JVM的類載入是通過ClassLoader及其子類來完成的,類的層次關係和載入順序可以由來描述:

1)Bootstrap ClassLoader

負責載入$JAVA_HOME中jre/lib/rt.jar裡所有的class,由C++實現,不是ClassLoader子類

2)Extension ClassLoader

負責載入java平台中擴充功能的一些jar包,包括$JAVA_HOME中jre/lib/*.jar或-Djava.ext.dirs指定目錄下的jar包

3)App ClassLoader

負責記載classpath中指定的jar包及目錄中class

4)Custom ClassLoader

屬於應用程式根據自身需要自訂的ClassLoader,如tomcat、jboss都會根據j2ee規範自行實現ClassLoader

載入過程中會先檢查類是否被已載入,檢查順序是自底向上,從Custom ClassLoader到BootStrap ClassLoader逐層檢查,只要某個classloader已載入就視為已載入此類,保證此類只所有ClassLoader載入一次。而載入的順序是自頂向下,也就是由上層來逐層嘗試載入此類。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.