1. 程式人生 > >Java基礎加強——類加載機制

Java基礎加強——類加載機制

操作 擴展類 代碼 java類 sys 讓我 接口 加載 使用

  什麽叫類加載

    JVM把 .class 字節碼文件加載到內存,並進行相關的校驗、解析、初始化,最終轉換為虛擬機可用的JAVA類型的過程,稱為JVM類加載機制。

  (當然,JVM並不關心class文件的來源,什麽?什麽叫class文件?——每一個Java class文件都對一個Java類或者Java接口做出了全面描述

  類加載器的分類 

  啟動(Bootstrap)類加載器:引導類裝入器是用本地代碼實現的類裝入器,它負責將 <Java_Runtime_Home>/lib下面的核心類庫或-Xbootclasspath選項指定的jar包加載到內存中。由於引導類加載器涉及到虛擬機本地實現細節,開發者無法直接獲取到啟動類加載器的引用,所以不允許直接通過引用進行操作。(也叫根加載器)

  擴展(Extension)類加載器:擴展類加載器是由Sun的ExtClassLoader(sun.misc.Launcher$ExtClassLoader)實現的。它負責將< Java_Runtime_Home >/lib/ext或者由系統變量-Djava.ext.dir指定位置中的類庫加載到內存中。開發者可以直接使用標準擴展類加載器。

  系統(System)類加載器:系統類加載器是由 Sun的 AppClassLoader(sun.misc.Launcher$AppClassLoader)實現的。它負責將系統類路徑java -classpath或-Djava.class.path變量所指的目錄下的類庫加載到內存中。開發者可以直接使用系統類加載器。

  這三個類加載器還分階級
    3的領導是2 2的領導是1 1就是BOSS

  雙親委派模型

  雙親委派模型的工作過程為:如果一個類加載器收到了類加載的請求,它首先不會自己去嘗試加載這個類,而是把這個請求委派給父類加載器去完成,每一個層次的加載器都是如此,因此所有的類加載請求都會傳給頂層的啟動類加載器,只有當父加載器反饋自己無法完成該加載請求(該加載器的搜索範圍中沒有找到對應的類)時,子加載器才會嘗試自己去加載

  引自百度:

一道面試題

能不能自己寫個類叫java.lang.System?

答案:通常不可以,但可以采取另類方法達到這個需求。
解釋:為了不讓我們寫System類,類加載采用委托機制,這樣可以保證爸爸們優先,爸爸們能找到的類,兒子就沒有機會加載。而System類是Bootstrap加載器加載的,就算自己重寫,也總是使用Java系統提供的System,自己寫的System類根本沒有機會得到加載。

Java基礎加強——類加載機制