JVM-JVM加載class文件

Java程序中所有的class文件都需要加載至JVM中才能運行,加載行爲由類加載器(Class Loader)完成。通常開發人員無需關心類加載(隱式裝載),如遇反射等特殊用法則需顯式加載所需的類。
 

類裝載方式

  • 隱式裝載:通過new等方式生成對象時,隱式調用類裝載器加載對應的類到JVM中。
  • 顯式裝載:通過class.forname()等方法,顯式加載所需的類到JVM中。
Java類的加載過程是動態的,不會一次性將所有類全部加載後再運行,而是保證程序運行的基礎類(像是基類)完全加載到JVM中,至於其他類,則在需要的時候才加載。這當然就是爲了節省內存開銷。
 

類加載器介紹

 
Java類加載器有三個,對應Java的三種類(系統類,擴展類,自定義類)。 
 
  • Bootstrap Loader
負責加載系統類 (內置類,像是String,對應於C#中的System類和C/C++標準庫中的類)
 
  • ExtClassLoader   
負責加載擴展類(繼承類和實現類)
 
  • AppClassLoader   
負責加載應用類(程序員自定義的類)
 

委託模型機制

 
Java採用委託模型機制,實現三個加載器協同工作、加載各自的類、完成各自工作。
 
委託模型機制:當類加載器需要加載類的時,先請示其Parent(即上一層加載器)在其搜索路徑載入,如果找不到,纔在自己的搜索路徑搜索該類。這樣的順序其實就是加載器層次上自頂而下的搜索,因爲加載器必須保證基礎類的加載。這種機制的設計是出於安全的考慮:如果某人將一個惡意的基礎類加載到jvm,委託模型機制會搜索其父類加載器,顯然是不可能找到的,自然就不會將該類加載進來。
 
獲取類加載器
 
ClassLoader loader = ClassName.class.getClassLoader();
ClassLoader ParentLoader = loader.getParent();

注意:Java在邏輯上並不存在Bootstrap Loader實體,因爲它是用C++編寫的,所以打印其內容將會得到null。

 

類加載器原理

1.裝載:查找和導入class文件;
 
2.連接:
 
 (1)檢查:檢查載入的class文件數據的正確性;
 
 (2)準備:爲類的靜態變量分配存儲空間;
 
 (3)解析:將符號引用轉換成直接引用(這一步是可選的)
 
3.初始化:初始化靜態變量、靜態代碼塊。
 
 初始化過程在程序調用類的靜態成員的時開始執行,所以靜態方法main()纔會成爲一般程序的入口方法。類的構造器也會引發該動作。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章