日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

java類加載機制、類加載器、自定義類加載器的案例

瀏覽:162日期:2022-08-16 17:54:15
類加載機制

java類從被加載到JVM到卸載出JVM,整個生命周期包括:加載(Loading)、驗證(Verification)、準備(Preparation)、解析(Resolution)、初始化(Initialization)、使用(using)、和卸載(Unloading)七個階段。

其中驗證、準備和解析三個部分統稱為連接(Linking)。

java類加載機制、類加載器、自定義類加載器的案例

1、加載

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

java類加載機制、類加載器、自定義類加載器的案例

類的加載通過JVM提供的類加載器完成,類加載器是程序運行的基礎。程序在啟動的時候,并不會一次性加載程序所要用到的所有class文件,而是根據需要,通過java的類加載器機制(classLoader)來動態加載某個class文件到內存中。

jvm在運行時會產生三個classLoader:

啟動類加載器(BootStrap ClassLoader):是java類加載層次中最頂層的類加載器,負責加載jdk中的核心類庫。由C++實現,不是classLoader的子類。

擴展類加載器(Extension ClassLoader):負責加載java的擴展類庫,比如lib/ext或者java.ext.dirs系統屬性指定的目錄中的jar包。父類加載器為null。

系統類加載器(App ClassLoader):負責加載來自java命令的-classpath選項、java.class.path系統屬性所指定的jar包和類路徑。程序可以通過classLoader的靜態方法getSystemClassLoader(),來獲取系統類加載器。由java語言實現,父類加載器為ExtClassLoader。

除了java默認提供的這三個classLoader之外,用戶可以根據需要定義自己的classLoader,這些自定義的classLoader都必須繼承自java.lang.ClassLoader類。

通過使用不同的類加載器,可以從不同來源加載類的二進制數據。通常有如下幾種情況:

從本地文件系統加載class文件,這是絕大部分實例程序的類加載方式。從jar包加載class類,這種方式也很常見。通過網絡加載class類把一個java源文件動態編譯,并執行加載,比如jsp。

2、連接

當類被加載之后,系統為之生成一個對應的class對象,接著進入連接階段(驗證-準備-解析),連接階段負責把類的二進制數據合并到jre中。

驗證:用于檢測被加載的類是否有正確的內部結構,并和其他類協調一致。

包括四種驗證:文件格式驗證、元數據驗證、字節驗證和符號引用驗證。準備:負責為類變量分配內存,并設置默認初始值。

解析:將類的二進制數據中的變量進行符號引用替換成直接引用。

3、初始化

在初始化階段,主要為類的靜態變量賦予正確的初始值。其實就是執行類構造器<clinit>()方法的過程。

在java類中對類變量指定初始值有兩種方式:a.聲明類變量時指定初始值;b.使用靜態初始化塊為類變量指定初始值。

jvm初始化一個類包含如下步驟:

加載并連接該類先初始化其直接父類依次執行初始化語句當執行第2步時,系統對直接父類的初始化也遵循1~3,以此類推。

當一個類被主動引用后會觸發初始化過程:

遇到new、getstatic、putstatic或invokestatic這4條字節碼指令時,如果類沒有進行過初始化,則需要先觸發其初始化。

生成這4條指令最常見的Java代碼場景是:使用new關鍵字實例化對象時、讀取或者設置一個類的靜態字段(被final修飾、已在編譯器把結果放入常量池的靜態字段除外)時、以及調用一個類的靜態方法的時候。

使用java.lang.reflect包的方法對類進行反射調用的時候,如果類沒有進行過初始化,則需要先觸發其初始化。

當初始化一個類的時候,如果發現其父類還沒有進行過初始化,則需要觸發父類的初始化。當虛擬機啟動時,用戶需要指定一個執行的主類(包含main()方法的類),虛擬機會先初始化這個類。

當使用jdk7+的動態語言支持時,如果java.lang.invoke.MethodHandle實例最后的解析結果REF_getStatic、REF_putStatic、REF_invokeStatic的方法句柄,并且這個方法句柄所對應的類沒有進行過初始化,則需要先觸發器 初始化。

當一個類如果是被動引用的話,不會觸發初始化過程:

通過子類引用父類的靜態字段,不會導致子類初始化。對于靜態字段,只有直接定義該字段的類才會被初始化,因此當我們通過子類來引用父類中定義的靜態字段時,只會觸發父類的初始化,而不會觸發子類的初始化。

通過數組定義來引用類,不會觸發此類的初始化。

常量在編譯階段會存入調用類的常量池中,本質上沒有直接引用到定義常量的類,因此不會觸發定義常量的類的初始化。

4、使用

(略)

5、卸載

如果出現下面的情況,類就會被卸載:

該類所有的實例都已經被回收,也就是java堆中不存在該類的任何實例。加載該類的ClassLoader已經被回收。

該類對應的java.lang.Class對象沒有任何地方被引用,無法在任何地方通過反射訪問該類的方法。

如果以上三個條件全部滿足,jvm就會在方法區垃圾回收的時候對類進行卸載,類的卸載過程其實就是在方法區中清空類信息,java類的整個生命周期就結束了。

類加載器

類加載器負責加載所有的類。其為所有被載入內存中的類生成一個java.lang.Class實例對象。一旦一個類被加載如JVM中,同一個類就不會被再次載入了。

正如一個對象有一個唯一的標識一樣,一個載入JVM的類也有一個唯一的標識。

在Java中,一個類用其全限定類名(包括包名和類名)作為標識;但在JVM中,一個類用其全限定類名和其類加載器作為其唯一標識。

例如,如果在pg的包中有一個名為Person的類,被類加載器ClassLoader的實例kl負責加載,則該Person類對應的Class對象在JVM中表示為(Person.pg.kl)。

這意味著兩個類加載器加載的同名類:(Person.pg.kl)和(Person.pg.kl2)是不同的、它們所加載的類也是完全不同、互不兼容的。

前面我們已經介紹了java中的幾種類加載器,下面我們用一張圖展示他們的層次關系:

java類加載機制、類加載器、自定義類加載器的案例

類加載步驟

類加載器加載class大致需要如下8個步驟:

檢測此Class是否載入過,即在緩沖區中是否有此Class,如果有直接進入第8步,否則進入第2步。

如果沒有父類加載器,則要么Parent是根類加載器,要么本身就是根類加載器,則跳到第4步,如果父類加載器存在,則進入第3步。

請求使用父類加載器去載入目標類,如果載入成功則跳至第8步,否則接著執行第5步。

請求使用根類加載器去載入目標類,如果載入成功則跳至第8步,否則跳至第7步。

當前類加載器嘗試尋找Class文件,如果找到則執行第6步,如果找不到則執行第7步。

從文件中載入Class,成功后跳至第8步。

拋出ClassNotFountException異常。返回對應的java.lang.Class對象。

類加載機制

全盤負責:當一個類加載器負責加載某個Class時,該Class所依賴和引用其他Class也將由該類加載器負責載入,除非顯示使用另外一個類加載器來載入。

雙親委派:先讓父類加載器試圖加載該Class,只有在父類加載器無法加載該類時才嘗試從自己的類路徑中加載該類。

通俗的講,就是某個特定的類加載器在接到加載類的請求時,首先將加載任務委托給父加載器,依次遞歸,如果父加載器可以完成類加載任務,就成功返回;只有父加載器無法完成此加載任務時,才自己去加載。

緩存機制:保證所有加載過的Class都會被緩存,當程序中需要使用某個Class時,類加載器先從緩存區中搜尋該Class,只有當緩存區中不存在該Class對象時,系統才會讀取該類對應的二進制數據,并將其轉換成Class對象,存入緩沖區中。

這就是為很么修改了Class后,必須重新啟動JVM,程序所做的修改才會生效的原因。

自定義的類加載器

jvm除跟類加載器之外的所有類加載器都是ClassLoader子類的實例,開發者可以通過拓展ClassLoader的子類,并重寫該ClassLoader所包含的方法實現自定義的類加載器。

ClassLoader有如下兩個關鍵方法:

loadClass(String name,boolean resolve):該方法為ClassLoader的入口點,根據指定名稱來加載類,系統就是調用ClassLoader的該方法來獲取指定類的class對象。

findClass(String name):根據指定名稱來查找類如果需要實現自定義的ClassLoader,則可以通過重寫以上兩個方法來實現,通常推薦重寫findClass()方法而不是loadClass()方法。

classLoader()方法的執行步驟:

1)findLoadedClass():來檢查是否加載類,如果加載直接返回;

2)父類加載器上調用loadClass()方法。如果父類加載器為null,則使用跟類加載器加載;

3)調用findClass(String)方法查找類。從這邊可以看出,重寫findClass()方法可以避免覆蓋默認類加載器的父類委托,緩沖機制兩種策略;如果重寫loadClass()方法,則實現邏輯更為復雜。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持好吧啦網。如有錯誤或未考慮完全的地方,望不吝賜教。

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
午夜精品成人av| 蜜桃视频一区二区三区在线观看| 老司机精品久久| 亚洲一区日本| 在线亚洲观看| 一区福利视频| 色8久久久久| 综合激情一区| 亚洲黄色中文字幕| 亚洲性色av| yellow在线观看网址| 婷婷精品进入| 在线精品视频在线观看高清| 图片区亚洲欧美小说区| 午夜在线视频观看日韩17c| 欧美日韩国产综合网| 中文字幕在线官网| 99视频在线精品国自产拍免费观看| av一区二区高清| 天海翼亚洲一区二区三区| 视频一区日韩| 国产精品资源| 91精品国产乱码久久久久久久| 伊人久久av| 欧美黑人巨大videos精品| 国产精品亚洲一区二区三区在线观看| av一区在线| 日韩精品视频中文字幕| 国产精品伦一区二区| 精品视频自拍| 另类亚洲自拍| 日韩在线黄色| 久久av综合| 日韩欧美综合| 久久国产88| 国产一区二区三区黄网站| 久久精品免费一区二区三区| 青青草国产精品亚洲专区无| 国产精品乱战久久久| 粉嫩av一区二区三区四区五区 | 高清日韩中文字幕| 亚洲va中文在线播放免费| 吉吉日韩欧美| 国产精品毛片| 伊人久久亚洲| 亚洲免费在线| 国产精久久一区二区| 欧美特黄一级大片| 久久不卡国产精品一区二区| 久久国产人妖系列| 美日韩一区二区三区| 日本麻豆一区二区三区视频| 欧美在线综合| 欧美国产另类| 亚洲精品2区| 蜜桃免费网站一区二区三区 | 国产96在线亚洲| 亚洲精品精选| 久久uomeier| 激情婷婷欧美| 嫩呦国产一区二区三区av| 99精品视频在线| 国产一区二区三区四区二区| 久久一级电影| 国产伦精品一区二区三区千人斩 | 精品国内亚洲2022精品成人| 欧美精品九九| 偷拍精品精品一区二区三区| 天堂va在线高清一区| 最新亚洲激情| 国产一区丝袜| 中文字幕一区二区av| 夜夜嗨网站十八久久 | 视频一区日韩精品| 亚洲特级毛片| 国产精品黄网站| 一区在线视频观看| 精品美女在线视频| 最近国产精品视频| 丝袜a∨在线一区二区三区不卡| 精品精品国产三级a∨在线| 国产美女撒尿一区二区| 久久国产精品久久w女人spa| www.51av欧美视频| 国产成人免费精品| 日本a口亚洲| 久久精品动漫| 日韩高清中文字幕一区二区| 国产日本久久| 国产精品一区二区精品视频观看| 免费人成在线不卡| 日韩免费福利视频| 免费一二一二在线视频 | 好吊日精品视频 | 爽好多水快深点欧美视频| 精品日产乱码久久久久久仙踪林| 麻豆视频一区| 91成人精品观看| 国产精品亚洲人成在99www| 中文字幕亚洲影视| 精品亚洲美女网站| 久久国内精品视频| 婷婷综合福利| 激情综合在线| 日韩毛片视频| 国产91在线精品| 激情91久久| 精品国产一区二区三区av片| 日本а中文在线天堂| 911精品国产| sm久久捆绑调教精品一区| 亚洲专区欧美专区| 国产精品呻吟| 亚洲国产不卡| 亚洲人成精品久久久| 久久亚洲美女| 夜夜嗨一区二区| 日产欧产美韩系列久久99| 国产亚洲毛片| 天堂精品久久久久| 日本不卡高清| 91嫩草精品| 91综合视频| 岛国av在线网站| 欧美日韩免费观看一区=区三区| 99精品美女| 亚洲电影在线一区二区三区| 亚洲精品日本| 91大神在线观看线路一区| 国产精东传媒成人av电影| 精品久久网站| 亚洲综合在线电影| 蜜臀av在线播放一区二区三区| 日韩精品一二三区| 日本欧美一区| 国产精品v亚洲精品v日韩精品| 国产精品久久777777毛茸茸| 亚洲va在线| 中文在线不卡| 国产精品一线天粉嫩av| 国产精品原创| 午夜久久免费观看| 国产探花一区| 国产传媒在线| 亚洲3区在线| 国产免费久久| 国产精品videosex极品| 欧美日韩中文字幕一区二区三区| av不卡免费看| 国产美女久久| 成人自拍av| 国产亚洲一区二区手机在线观看 | 免费高潮视频95在线观看网站| 久久久久国产精品一区二区| 日韩精品福利一区二区三区| 红杏一区二区三区| 美女国产一区| 国产精品jk白丝蜜臀av小说| 91精品一区国产高清在线gif | 快she精品国产999| 国产亚洲电影| 亚洲伦乱视频| 国产精品免费精品自在线观看| 麻豆mv在线观看| 91伊人久久| 黑森林国产精品av| 欧美综合另类| 久久影院一区二区三区| 国产一区二区久久久久| 日本不卡在线视频| 97精品国产| 亚洲精品欧美| 国产精品普通话对白| 麻豆传媒一区二区三区| 亚洲尤物av| 日韩在线精品| 麻豆9191精品国产| 免费精品国产的网站免费观看| 日韩高清在线一区| 中文字幕一区二区三区四区久久| 日产午夜精品一线二线三线| 国产精品中文字幕亚洲欧美 | 亚洲精品**中文毛片| 日韩成人精品一区二区三区| 欧洲精品一区二区三区| 91麻豆精品激情在线观看最新| 视频一区在线播放| 欧洲亚洲一区二区三区| 久久免费福利| 日韩免费精品| 日韩高清成人在线| 国产午夜精品一区二区三区欧美| 国产日韩欧美一区| 久久激情五月婷婷| 欧美午夜不卡影院在线观看完整版免费| 国产91在线播放精品| 亚洲一区二区三区在线免费| 国产成人免费| 黄色欧美在线| 国产日韩视频在线|