国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

Java類加載器

2019-11-11 05:59:51
字體:
來源:轉載
供稿:網友

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加載一次。而加載的順序是自頂向下,也就是由上層來逐層嘗試加載此類。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 临清市| 宜州市| 凤山县| 团风县| 遵义市| 讷河市| 绥中县| 双峰县| 寿宁县| 石狮市| 贞丰县| 中江县| 墨脱县| 平山县| 车致| 昆明市| 朝阳县| 紫阳县| 白银市| 广东省| 山丹县| 玉门市| 贵南县| 木里| 托克托县| 浪卡子县| 华池县| 万源市| 喀喇| 无极县| 璧山县| 广灵县| 麦盖提县| 淅川县| 锡林浩特市| 永登县| 贵德县| 荃湾区| 廊坊市| 北宁市| 定边县|