透過類別的全限定名稱(套件名稱類別名稱),取得到類別的 .class
文件,載入到元空間。
驗證:檢定.class
檔案的安全性
準備:為靜態類型變數分配記憶體並設定預設值
#解析:將常數池內的符號引用轉換為直接引用,符號引用指向一個未被載入的類,或是未被載入類別的欄位或方法,那麼解析將會觸發這個類別的載入
執行類的建構器方法init
()的過程,若該類別具有父類,jvm
會保證父類別的init
先執行,然後在執行子類的init
。
啟動類別載入器是由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中文網其他相關文章!