首頁 > Java > java教程 > 主體

Java類別載入器與類別載入過程的概述

王林
發布: 2023-04-24 10:13:07
轉載
861 人瀏覽過

1. 類別載入程序

Java類別載入器與類別載入過程的概述

載入

透過類別的全限定名稱(套件名稱類別名稱),取得到類別的 .class文件,載入到元空間。

連結

  • 驗證:檢定.class檔案的安全性

  • 準備:為靜態類型變數分配記憶體並設定預設值

  • #解析:將常數池內的符號引用轉換為直接引用,符號引用指向一個未被載入的類,或是未被載入類別的欄位或方法,那麼解析將會觸發這個類別的載入

初始化

執行類的建構器方法init()的過程,若該類別具有父類,jvm會保證父類別的init先執行,然後在執行子類的init

2. 類別載入器

Java類別載入器與類別載入過程的概述

啟動類別載入器

啟動類別載入器是由C/C 語言實作的,用來載入Java核心類別庫。啟動類別只載入套件名稱:java、javax、sun開頭的類別

擴充類別載入器

#父類別載入器為啟動類別載入器載入以下兩個目錄中的類別庫:

  • java.ext.dirs目錄

  • JDK安裝目錄:jre/lib/ext目錄

#我們可以將自己的套件放在以上目錄下,就會自動載入進來了。

應用程式類別載入器

父類別載入器為啟動類別載入器,負責載入環境變數classpath系統屬性java .class.path指定路徑下的類別庫,是程式中預設的類別載入器,我們Java程式中的類,都是由它載入完成的。

自訂類別載入器

繼承java.lang.ClassLoader類,重寫findClass()方法 。如果沒有太複雜的需求,可以直接繼承URLClassLoader類,重寫loadClass方法。

作用

  • 加密:Java程式碼可以輕易的被反編譯,如果你需要把自己的程式碼進行加密以防止反編譯,可以先將編譯後的程式碼用某種加密演算法加密,類別加密後就不能再用Java的ClassLoader去載入類別了,這時就需要自訂ClassLoader在載入類別的時候先解密類,然後再加載。

  • 從非標準的來源載入程式碼:如果你的字節碼是放在資料庫、甚至是在雲端,就可以自訂類別載入器,從指定的來源載入類。

雙親委派模型

jvm對class檔案採用的是按需載入的方式,當需要使用該類別時,jvm才會將它的class檔案載入到記憶體中產生class物件。在載入類別的時候,是採用的雙親委派機制

  • 如果一個類別載入器接收到了類別載入的請求,它自己不會先去加載,會把這個請求委託給父類別載入器去執行。

  • 如果父類別還存在父類別載入器,則繼續向上委託,一直委託到啟動類別載入器:Bootstrap ClassLoader

  • 如果父類別載入器可以完成載入任務,就回傳成功結果,如果父類別載入失敗,就由子類別自己去嘗試加載,如果子類別載入失敗就會拋出ClassNotFoundException異常,這就是雙親委派模式

#打破雙親委派模型

用途:

  • Java應用程式中存在著許多服務提供者介面(Service Provider Interface,SPI),這些介面允許第三方為它們提供實現,如常見的SPI 有JDBC、JNDI等,這些SPI 的介面屬於Java 核心庫,一般存在rt.jar套件中,由Bootstrap類別載入器載入。而Bootstrap類別載入器無法直接載入SPI的實作類,所以需要反向委派給其他類別載入器進行載入

  • 在Tomcat伺服器中,存在一個伺服器運行多個不同版本但同名服務的需求,所以需要打破雙親委派模型,載入多個同名類別。

方法:

  • #使用上下文類別載入器

  • 重寫loadClass方法

以上是Java類別載入器與類別載入過程的概述的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:yisu.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板