loading 到記憶體
linking
verification (驗證class檔案,「cafe babe」)
preperation (class靜態變數賦預設值 int->0 object->null)
resolution
initializing (靜態變數賦初始值)
的方法進行載入class檔案
雙親委派
即:classload載入class檔案,首先先向上詢問自己的父載入器(不是父類,是classload裡的parent屬性)是否已載入此class檔案(類似於快取,用乙個set來儲存已載入的class),一直詢問到最上層的classload,如果有則返回;如果沒有,則呼叫自己的loadclass方法進行載入,若無法載入,則向下讓子載入器呼叫loadclass載入,一直到最後一層若還妹有載入,丟擲classnotfount異常。
雙親委派由loadclass方法實現
原始碼如下:
在這裡插入**片
整合 classload類,重寫findclass方法
public
class
myclassload
extends
classloader
byte
data = bos.
tobytearray()
; fis.
close()
; bos.
close()
;// 呼叫defineclass 把 class載入到記憶體
return
defineclass
(name,data,
0,data.length);}
catch
(exception e)
return null;
}}
在findclass方法裡呼叫defineclass
測試結果
自定義classloader如何指定parent
檢視原始碼可知,只需要重寫建構函式,在重寫的建構函式中呼叫super(parent)即可指定
原始碼如下:
在這裡插入**片
使用的設計模式:模板方法(鉤子函式)
雙親委派的作用
快取的作用:防止重複載入class
如tomcat的熱載入機制,重寫了loadclass方法。
JVM之Class檔案結構
但是乙個類或者介面不一定生成class檔案,classloader直接生成。各個資料項按照嚴格的順序排列在class檔案中,沒有任何分隔符,當遇到需要占用8位位元組以上的資料項時,則會按照高位在前 或低位在前 方式分割為若干個8位位元組儲存。big endian little endian。clas...
JVM載入class檔案的原理機制?
jvm中類的裝載是由類載入器 classloader 和它的子類來實現的,j a中的類載入器是乙個重要的j a執行時系統元件,它負責在執行時查詢和裝入類檔案中的類。由於j a的跨平台性,經過編譯的j a源程式並不是乙個可執行程式,而是乙個或多個類檔案。當j a程式需要使用某個類時,jvm會確保這個類...
JVM載入class原理
當j a編譯器編譯好.class檔案之後,我們需要使用jvm來執行這個class檔案。那麼最開始的工作就是要把位元組碼從磁碟輸入到記憶體中,這個過程我們叫做 載入 載入完成之後,我們就可以進行一系列的執行前準備工作了,比如 為類靜態變數開闢空間,將常量池存放在方法區記憶體中並實現常量池位址解析,初始...