溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java類加載器是什么

發(fā)布時間:2021-08-23 21:13:56 來源:億速云 閱讀:184 作者:chen 欄目:大數(shù)據(jù)

這篇文章主要講解了“java類加載器是什么”,文中的講解內(nèi)容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“java類加載器是什么”吧!

java類加載器是什么

 

  一.什么是類加載?

        類加載器是一個加載類文件的java類,類加載器負責加載文件系統(tǒng),網(wǎng)絡或其他來源的類文件,java虛擬機將java編譯后的class文件(類描述文件),加載進堆內(nèi)存中,并進行校驗,轉(zhuǎn)換解析,初始化,最終形成虛擬機可識別的java類型。jvm中有三個默認的類加載器,分別是根類加載器,擴展類加載器和應用類加載器。

  二.類加載器干了些什么事情?

        類加載器處理字節(jié)碼文件,java中,類加載器要將一個class文件裝入jvm中,需要以下步驟:

    (1)裝載:查找和導入class文件;

    (2)鏈接:

        a.檢查:檢查載入的class文件是否正確:格式,語法等。

        b.準備:給靜態(tài)變量分配內(nèi)存空間

        c.解析:將符號引用轉(zhuǎn)換成直接引用

    (3初始化:對靜態(tài)變量和代碼塊進行初始化

  三.動態(tài)加載和動態(tài)鏈接什么時候會觸發(fā)?

        java多態(tài)的特性,就是利用可以動態(tài)的鏈接實現(xiàn)的,就是運行時才知道它的具體實現(xiàn),所以解析過程還可以在初始化之后執(zhí)行,這個過程就是動態(tài)綁定;

  四.類的初始化方式有哪些?

    (1)new ,getStatic,putStatic,invokeStatic 指令,都會觸發(fā)類的初始化

    (2)java.long.reflect包的方法進行反射調(diào)用 Class.forName("com.jd.xxxx")

    (3)初始化子類也會,先初始化父類

    (4)調(diào)用類的靜態(tài)方法

    (5)jvm的啟動類,main方法的類

  五.類加載器怎么裝載的?

    (1)通過類名,找到對應的二進制字節(jié)流

    (2)將字節(jié)流代表的靜態(tài)存儲結構轉(zhuǎn)化為方法區(qū)運行時數(shù)據(jù)結構

    (3)在堆內(nèi)存中生成代表這個類的對象,作為方法區(qū)訪問的入口

  六.準備階段做了哪些事?

        (1)給靜態(tài)變量賦初始值,對于實例變量只會在對象初始化的時候?qū)χ鴮ο笠黄鸱峙涞蕉阎?/p>

    (2)初始值只是變量的默認值,例如:public static final int = 123;這個時候只會初始化 0 ;

  七.jvm的類加載是怎么加載的?

    (1)依賴ClassLoader以及子類完成的。

    (2)不同的ClassLoader,加載不同的模塊,而且有加載順序

    (3)BootstrapClassLoader負責加載jre/lib/rt.jar下的所有包,或者-Xbootclasspath選項指定的jar包

    (4)Extension ClassLoader 負責加載lib/ext/*.jar,也可以指定目錄Djava.ext.dirs

    (5)AppClassLoader 加載classpath下的類或指定的類

    (6)自定義類加載器,實現(xiàn)ClassLoader

  八.自定義類加載器在哪里應用?

        如tomcat、jboss都會根據(jù)j2ee規(guī)范自行實現(xiàn)ClassLoader加載過程中會先檢查類是否被已加載,檢查順序是自底向上,從Custom ClassLoader到BootStrap ClassLoader逐層檢查,只要某個classloader已加載就視為已加載此類,保證此類只所有ClassLoader加載一次。而加載的順序是自頂向下,也就是由上層來逐層嘗試加載此類

  九.什么是雙親委托

    1.子類加載器會首先委托父類加載器去加載,逐層往上進行檢查加載。
    2.所以從上往下,bootStrap類加載器會先看看rt.jar中有沒有該類,再看extension類加載器有沒有加載該類,有則Application類加載器不需要加載classpath類文件加載目錄。
        注意:BootStrap ClassLoader并不屬于JVM的類等級層次,它沒有遵循ClassLoader的加載規(guī)則它也沒有子類。JVM能提取到的頂層父類是ClassLoader,然后URLClassLoader實現(xiàn)了該抽象類而ExtClassLoader和AppClassLoader都繼承了URLClassLoader,不過他們是sun.miss.Launcher的內(nèi)部類,所以創(chuàng)建Launcher類是會創(chuàng)建ExtClassLoader ,然后ExtClassLoader作為父加載器創(chuàng)建AppClassLoader。

java類加載器是什么

java類加載器是什么

  十.類加載器的工作原理:

        1.原理基于三個機制:委托,可見性和單一性

        2.委托就是子類加載器會委托父類加載器;可見性就是子類可以看見父類加載的類,父類卻看不到子類:如果一個類被子類加載,則父類再去加載該類會拋出ClassNotFundException異常; 單一性原理是指僅加載一個類一次,這是由委托機制確保子類加載器不會再次加載父類加載器加載過的類。

    備注:雖然重寫違反委托和單一性機制的類加載器是可能的,但這樣做并不可取。你寫自己的類加載器的時候應該嚴格遵守這三條機制

 十一.如何自己實現(xiàn)一個類加載器
      a.加載自定義路勁下的文件:
          思路:1.繼承ClassLoader類,指定ClassPath路勁,重寫findClass文件,如果不是自定義的class目錄仍然使用父類加載。2.繼承URLClassLoader類,自定義一個Url,然后調(diào)用findClass(url);
      b.加載自定義格式的Class,加密解密等網(wǎng)絡傳輸接受的文件。
          思路:獲取網(wǎng)絡傳輸流,解密還原類文件格式。通過ClassLoader的defineClass()創(chuàng)建這個類的實例
  十二.問題和思考:
      a.如何實現(xiàn)一個熱部署?
      b.程序運行時動態(tài)加載類會有什么問題?
      c.熱部署時JVM中的對象如何平滑過渡?

例子:嘗試用戶父加載器進行類再次加載,會拋出異常,驗證單一性。其他的可以自己試一試

java類加載器是什么

感謝各位的閱讀,以上就是“java類加載器是什么”的內(nèi)容了,經(jīng)過本文的學習后,相信大家對java類加載器是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI