欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

classloader類加載器_基于java類的加載方式詳解

 更新時間:2017年10月20日 09:12:13   作者:zhangzc----java  
下面小編就為大家?guī)硪黄猚lassloader類加載器_基于java類的加載方式詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

基礎(chǔ)概念

Classloader 類加載器,用來加載 Java 類到 Java 虛擬機(jī)中。與普通程序不同的是。Java程序(class文件)并不是本地的可執(zhí)行程序。當(dāng)運(yùn)行Java程序時,首先運(yùn)行JVM(Java虛擬機(jī)),然后再把Java class加載到JVM里頭運(yùn)行,負(fù)責(zé)加載Java class的這部分就叫做Class Loader。

JVM本身包含了一個ClassLoader稱為Bootstrap ClassLoader,和JVM一樣,BootstrapClassLoader是用本地代碼實(shí)現(xiàn)的,它負(fù)責(zé)加載核心JavaClass(即所有java.*開頭的類)。另外JVM還會提供兩個ClassLoader,它們都是用Java語言編寫的,由BootstrapClassLoader加載;其中Extension ClassLoader負(fù)責(zé)加載擴(kuò)展的Javaclass(例如所有javax.*開頭的類和存放在JRE的ext目錄下的類),ApplicationClassLoader負(fù)責(zé)加載應(yīng)用程序自身的類。

當(dāng)運(yùn)行一個程序的時候,JVM啟動,運(yùn)行bootstrapclassloader,該ClassLoader加載java核心API(ExtClassLoader和AppClassLoader也在此時被加載),然后調(diào)用ExtClassLoader加載擴(kuò)展API,最后AppClassLoader加載CLASSPATH目錄下定義的Class,這就是一個程序最基本的加載流程。

注: 學(xué)ClassLoader看OSGI程序應(yīng)用

什么時候JVM會使用ClassLoader加載一個類呢?當(dāng)你使用java去執(zhí)行一個類,JVM使用ApplicationClassLoader加載這個類;然后如果類A引用了類B,不管是直接引用還是用Class.forName()引用,JVM就會找到加載類A的ClassLoader,并用這個ClassLoader來加載類B。JVM按照運(yùn)行時的有效執(zhí)行語句,來決定是否需要裝載新類,從而裝載盡可能少的類,這一點(diǎn)和編譯類是不相同的。

Why use your own ClassLoader?

似乎JVM自身的ClassLoader已經(jīng)足夠了,為什么我們還需要創(chuàng)建自己的ClassLoader呢?

因?yàn)镴VM自帶的ClassLoader只是懂得從本地文件系統(tǒng)加載標(biāo)準(zhǔn)的java class文件,如果編寫你自己的ClassLoader,你可以做到:

1)在執(zhí)行非置信代碼之前,自動驗(yàn)證數(shù)字簽名

2)動態(tài)地創(chuàng)建符合用戶特定需要的定制化構(gòu)建類

3)從特定的場所取得java class,例如數(shù)據(jù)庫中

4) 等等

事實(shí)上當(dāng)使用Applet的時候,就用到了特定的ClassLoader,因?yàn)檫@時需要從網(wǎng)絡(luò)上加載java class,并且要檢查相關(guān)的安全信息。

應(yīng)用服務(wù)器大都使用了ClassLoader技術(shù),即使你不需要創(chuàng)建自己的ClassLoader,了解其原理也有助于更好地部署自己的應(yīng)用。

重點(diǎn)注明:其實(shí)一個已經(jīng)加載的類是無法被更新的,如果你試圖用同一個ClassLoader再次加載同一個類,就會得到異常(java.lang.LinkageError: duplicate classdefinition),我們只能夠重新創(chuàng)建一個新的ClassLoader實(shí)例來再次加載新類。至于原來已經(jīng)加載的類,開發(fā)人員不必去管它,因?yàn)樗赡苓€有實(shí)例正在被使用,只要相關(guān)的實(shí)例都被內(nèi)存回收了,那么JVM就會在適當(dāng)?shù)臅r候把不會再使用的類卸載。

絕大部分Java程序都會使用3種系統(tǒng)提供的類加載器

1.啟動類加載器(Bootstrap ClassLoader),負(fù)責(zé)將存在<JAVA_HOME>\lib目錄中的,或被-Xbootclasspath參數(shù)所指定的路徑中的,并且是虛擬機(jī)識別的類庫加載到虛擬機(jī)里.注意是按照文件名識別,如rt.jar,名字不符合的類庫即使放在lib目錄中也不會被加載。

2.擴(kuò)展類加載器(ExtClassLoader),它負(fù)責(zé)<JAVA_HOME>\lib\ext目錄中的,或被java.ext.dirs系統(tǒng)變量所指定的路徑中的所有類庫.

3.應(yīng)用程序類加載器(App-ClassLoader),通過cassLoader.getSystemClassLoader()獲取,它負(fù)責(zé)加載用戶類路徑(ClassPath)上所指定的類庫,一般情況下這個是程序中默認(rèn)的類加載器.

雙親委托模式 是Java設(shè)計(jì)者推薦給開發(fā)者的一種類加載實(shí)現(xiàn)方式.雙親委托模型的工作過程是:如果一個類加載器收到了類加載請求,它首先不會自己去嘗試加載這個類,而是把這個請求委派給父類加載器去完成.每一層次的類加載器都是如此,因此所有的加載請求最終都會傳送到頂層的啟動類加載器中,只有當(dāng)父類加載器沒有找到所需的類時,子加載器才會嘗試自己去加載。雙親模式的好處是Java類隨著它的類加載器一起具備了一種帶優(yōu)先級的層次關(guān)系。例如類Object,存放在rt.jar中,無論哪個類加載器加載這個類,最終都是委派給處于模型最頂端的啟動類加載,因此Object類在程序使用多種類加載器環(huán)境中依然能保證是同一個類。相反,如果沒有使用雙親模型,就可能出現(xiàn)用戶自己編寫一個Object類,導(dǎo)致系統(tǒng)中出現(xiàn)多個不同的Object類,這樣Java類型體系中最基礎(chǔ)的行為也就無法保證。

以上這篇classloader類加載器_基于java類的加載方式詳解就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • RocketMQ順序消息的原理與特點(diǎn)

    RocketMQ順序消息的原理與特點(diǎn)

    RocketMQ作為一款純java、分布式、隊(duì)列模型的開源消息中間件,支持事務(wù)消息、順序消息、批量消息、定時消息、消息回溯等,本篇我們了解如何實(shí)現(xiàn)順序消息的原理與特點(diǎn)
    2023-02-02
  • Java 代碼檢查工具之PMD入門使用詳細(xì)教程

    Java 代碼檢查工具之PMD入門使用詳細(xì)教程

    這篇文章主要介紹了Java 代碼檢查工具之PMD入門使用詳細(xì)教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • Java讀取txt文件和寫入txt文件的簡單實(shí)例

    Java讀取txt文件和寫入txt文件的簡單實(shí)例

    下面小編就為大家?guī)硪黄狫ava讀取txt文件和寫入txt文件的簡單實(shí)例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-11-11
  • Java 十大排序算法之計(jì)數(shù)排序刨析

    Java 十大排序算法之計(jì)數(shù)排序刨析

    計(jì)數(shù)排序是一個非基于比較的排序算法,該算法于1954年由 Harold H. Seward 提出。它的優(yōu)勢在于在對一定范圍內(nèi)的整數(shù)排序時,它的復(fù)雜度為Ο(n+k)(其中k是整數(shù)的范圍),快于任何比較排序算法
    2021-11-11
  • java虛擬機(jī)是做什么用的

    java虛擬機(jī)是做什么用的

    在本篇文章里小編給大家整理的是一篇關(guān)于java虛擬機(jī)作用等相關(guān)內(nèi)容,對此有興趣的朋友們可以學(xué)習(xí)參考下。
    2021-01-01
  • Springboot+ElementUi實(shí)現(xiàn)評論、回復(fù)、點(diǎn)贊功能

    Springboot+ElementUi實(shí)現(xiàn)評論、回復(fù)、點(diǎn)贊功能

    這篇文章主要介紹了通過Springboot ElementUi實(shí)現(xiàn)評論、回復(fù)、點(diǎn)贊功能。如果是自己評論的還可以刪除,刪除的規(guī)則是如果該評論下還有回復(fù),也一并刪除。需要的可以參考一下
    2022-01-01
  • JAVA多線程之中斷機(jī)制stop()、interrupted()、isInterrupted()

    JAVA多線程之中斷機(jī)制stop()、interrupted()、isInterrupted()

    這篇文章主要介紹了JAVA多線程之中斷機(jī)制stop()、interrupted()、isInterrupted()的相關(guān)資料,需要的朋友可以參考下
    2016-05-05
  • Java enum的用法詳細(xì)介紹及實(shí)例代碼

    Java enum的用法詳細(xì)介紹及實(shí)例代碼

    這篇文章主要介紹了Java enum的用法詳細(xì)介紹及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • 如何把JAR發(fā)布到maven中央倉庫的幾種方法

    如何把JAR發(fā)布到maven中央倉庫的幾種方法

    這篇文章主要介紹了如何把JAR發(fā)布到maven中央倉庫的幾種方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • 淺談SpringBoot 中關(guān)于自定義異常處理的套路

    淺談SpringBoot 中關(guān)于自定義異常處理的套路

    這篇文章主要介紹了淺談SpringBoot 中關(guān)于自定義異常處理的套路,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04

最新評論