紙上得來終覺淺,絕知此事要躬行
--陸遊 #問渠那得清如許,為有源頭活水來 --朱熹
#一個類別從被載入到記憶體開始到卸載出記憶體為止,它的整個生命週期包含了:載入(loading)、驗證(Verification)、準備(Preparetation)、解析(Resolution)、
初始化(Initialization)、使用(Using) 、卸載(Uploading)七個階段。其中驗證’準備和解析稱為連結。
##Loader類載入的架構
1)、Bootstrap Classloader啟動類別載入器,主要負責java_home/lib下的核心api或-Xbootstrap選項指定的jar包裝入工作。
2)、Extension ClassLoader擴充類別載入器,主要負責java_home/lib/ext下jar套件
3)、App CLassLoader 系統類別載入器,主要負責Java -classpath/所指的目錄下的類別與jar包的裝入工作;
4)、 UserCustom ClassLoader用戶自訂類別載入器,在程式運作期間,透過Java.lang.Classloader的子類別動態載入class
二、類別載入的特性
1)、每一個ClassLoader都會維護一個自己的命名空間,同一個命名空間不能出現兩個相同的類別名稱
2)、為了實作java安全沙箱模型頂層的類載入器安全機制, java預設採用了" 雙親委派的載入鏈" 結構。
三、類別的載入方式有三種:
1)、命令列啟動應用時由JVM初始化載入。
2)、透過class.forName()方法動態載入。
3)、透過ClassLoader().loadClass()方法動態載入。
這三種載入方式對靜態程式碼區塊的執行有影響。
如下範例:
public class MyHello { static { System.out.println("hello word"); } }public class Hello { public static void main(String[] args) { ClassLoader loader=Hello.class.getClassLoader(); try { //静态代码块不运行 //loader.loadClass("Test.MyHello"); //静态代码块运行输出hello world //Class.forName("Test.MyHello"); //静态代码块不运行 //Class.forName("Test.MyHello", false, loader); //静态代码块运行输出hello world Class.forName("Test.MyHello", true, loader); } catch (ClassNotFoundException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } } }
#一、ClassLoader類別載入的架構
# 1)、Bootstrap Classloader啟動類別載入器,主要負責java_home/lib下的核心api或-Xbootstrap選項指定的jar包裝入工作。
2)、Extension ClassLoader擴充類別載入器,主要負責java_home/lib/ext下jar套件
3)、App CLassLoader 系統類別載入器,主要負責Java -classpath/所指的目錄下的類別與jar套件的裝入工作;
4)、UserCustom ClassLoader使用者自訂類別載入器,在程式運作期間,透過Java.lang.Classloader的子類別動態載入class
以上是Java類別載入機制ClassLoder的詳解(圖文)的詳細內容。更多資訊請關注PHP中文網其他相關文章!