日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java类验证和装载顺序_java中类的加载顺序介绍(ClassLoader)

發布時間:2023/12/10 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java类验证和装载顺序_java中类的加载顺序介绍(ClassLoader) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉自:http://blog.csdn.net/eff666/article/details/52203406

1、ClassNotFoundExcetpion

我們在開發中,經常可以遇見java.lang.ClassNotFoundExcetpion這個異常,今天我就來總結一下這個問題。對于這個異常,它實質涉及到了java技術體系中的類加載。Java的類加載機制是技術體系中比較核心的部分,雖然它和我們直接打交道不多,但是對其背后的機理有一定理解有助于我們排查程序中出現的類加載失敗等技術問題。

2、類的加載過程

一個java文件從被加載到被卸載這個生命過程,總共要經歷5個階段,JVM將類加載過程分為:

加載->鏈接(驗證+準備+解析)->初始化(使用前的準備)->使用->卸載

(1)加載

首先通過一個類的全限定名來獲取此類的二進制字節流;其次將這個字節流所代表的靜態存儲結構轉化為方法區的運行時數據結構;最后在java堆中生成一個代表這個類的Class對象,作為方法區這些數據的訪問入口。總的來說就是查找并加載類的二進制數據。

(2)鏈接:

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

準備:為類的靜態變量分配內存,并將其初始化為默認值;

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

(3)為類的靜態變量賦予正確的初始值

3、類的初始化

(1)類什么時候才被初始化

1)創建類的實例,也就是new一個對象

2)訪問某個類或接口的靜態變量,或者對該靜態變量賦值

3)調用類的靜態方法

4)反射(Class.forName(“com.lyj.load”))

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

6)JVM啟動時標明的啟動類,即文件名和類名相同的那個類

(2)類的初始化順序

1)如果這個類還沒有被加載和鏈接,那先進行加載和鏈接

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

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

4)總的來說,初始化順序依次是:(靜態變量、靜態初始化塊)–>(變量、初始化塊)–> 構造器;如果有父類,則順序是:父類static方法 –> 子類static方法 –> 父類構造方法- -> 子類構造方法

4、類的加載

類的加載指的是將類的.class文件中的二進制數據讀入到內存中,將其放在運行時數據區的方法區內,然后在堆區創建一個這個類的java.lang.Class對象,用來封裝類在方法區類的對象。如:

類的加載的最終產品是位于堆區中的Class對象。Class對象封裝了類在方法區內的數據結構,并且向Java程序員提供了訪問方法區內的數據結構的接口。加載類的方式有以下幾種:

1)從本地系統直接加載

2)通過網絡下載.class文件

3)從zip,jar等歸檔文件中加載.class文件

4)從專有數據庫中提取.class文件

5)將Java源文件動態編譯為.class文件(服務器)

5、加載器

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

(1)加載器介紹

1)BootstrapClassLoader(啟動類加載器)

負責加載$JAVA_HOME中jre/lib/rt.jar里所有的class,加載System.getProperty(“sun.boot.class.path”)所指定的路徑或jar。

2)ExtensionClassLoader(標準擴展類加載器)

負責加載java平臺中擴展功能的一些jar包,包括$JAVA_HOME中jre/lib/*.jar或-Djava.ext.dirs指定目錄下的jar包。載System.getProperty(“java.ext.dirs”)所指定的路徑或jar。

3)AppClassLoader(系統類加載器)

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

4)CustomClassLoader(自定義加載器)

屬于應用程序根據自身需要自定義的ClassLoader,如tomcat、jboss都會根據j2ee規范自行實現。

(2)類加載器的順序

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

2)在加載類時,每個類加載器會將加載任務上交給其父,如果其父找不到,再由自己去加載。

3)Bootstrap Loader(啟動類加載器)是最頂級的類加載器了,其父加載器為null。

總結

以上是生活随笔為你收集整理的java类验证和装载顺序_java中类的加载顺序介绍(ClassLoader)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。