java類載入器,java類載入

來源:互聯網
上載者:User

java類載入器,java類載入
 類的載入過程

JVM將類載入過程分為三個步驟

裝載,串連,初始化,串連又分為三個步驟如下:

JVM將類載入過程分為三個步驟:裝載(Load),連結(Link)和初始化(Initialize)連結又分為三個步驟,如所示:


1)裝載:尋找並載入類的位元據;

2)連結:

  • 驗證:確保被載入類的正確性;
  • 準備:為類的靜態變數分配記憶體,並將其初始化為預設值;
  • 解析:把類中的符號引用轉換為直接引用;

3)初始化:為類的靜態變數賦予正確的初始值;

         那為什麼我要有驗證這一步驟呢?首先如果由編譯器產生的class檔案,它肯定是符合JVM位元組碼格式的,但是萬一有高手自己寫一個class檔案,讓JVM載入並運行,用於惡意用途,就不妙了,因此這個class檔案要先過驗證這一關,不符合的話不會讓它繼續執行的,也是為了安全考慮吧。

       準備階段和初始化階段看似有點牟盾,其實是不牟盾的,如果類中有語句:private static int a = 10,它的執行過程是這樣的,首先位元組碼檔案被載入到記憶體後,先進行連結的驗證這一步驟,驗證通過後準備階段,給a分配記憶體,因為變數a是static的,所以此時a等於int類型的預設初始值0,即a=0,然後到解析(後面在說),到初始化這一步驟時,才把a的真正的值10賦給a,此時a=10。


 類的初始化

 類什麼時候才被初始化:

  • 1)建立類的執行個體,也就是new一個對象
  • 2)訪問某個類或介面的靜態變數,或者對該靜態變數賦值
  • 3)調用類的靜態方法
  • 4)反射(Class.forName("com.lyj.load"))
  • 5)初始化一個類的子類(會首先初始化子類的父類)
  • 6)JVM啟動時標明的啟動類,即檔案名稱和類名相同的那個類

        只有這6中情況才會導致類的類的初始化。


類的載入

 啟動JVM的時候,可以使用三個類載入器:引導(bootstarp)類載入器,擴充(extensions)類載入器,應用程式(application)類載入器。


引導類載入器:僅僅負責載入核心的Java庫,比如位於<JAVA_HOME>/jre/lib目錄下的vm.jar,core.jar。這個類載入器,是JVM核心部分,是用native代碼寫成的。

擴充類載入器:負責載入擴充路徑下的代碼,一般位於<JAVA_HOME>/jre/lib/ext或者通過java.ext.dirs這個系統屬性指定的路徑下的代碼。這個類載入器是由sun.misc.Launcher$ExtClassLoader實現的。

應用類載入器: 一般來說,Java應用的類都是由它來完成載入的。可以通過 ClassLoader.getSystemClassLoader()來擷取它。


如果應用程式類載入器需要載入一個類,它首先委託擴充類載入器,擴充類載入器再委託引導類載入器。如果父類載入器不能載入類,子類載入器就回在自己的庫中尋找這個類。基於這個特性,類載入器只負責它的祖先無法載入的類。

小結:

類載入器是java的一個創新,基本上所有的類載入器都是用java.ClassLoaderler載入的一個執行個體。基本目的是協助我們理解對象的執行個體化過程以及對象的調用。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.