標籤:parent 轉化 stat 擴充 好的 實現 jvm 自訂 檔案載入
Java程式的運行,離不開class的載入,所謂類載入就是將編譯好的class檔案載入的jvm並形成class對象,只有class正確載入才能被執行個體化和調用。
public class test { public static void main(String[] args) { System.out.println(new test().getClass().getClassLoader()); System.out.println(new test().getClass().getClassLoader().getParent()); System.out.println(new test().getClass().getClassLoader().getParent().getParent()); }}
調用此方法會顯示如下結果:
[email protected]
[email protected]
null
最後一個null是因為這個載入器是由c++方法實現的,所以在代碼中擷取不到這個類,除了這個有c++實現的類載入之外,其他的類載入器都有parent載入器,基本上呈樹形結構,類載入的時候為了盡量保證calss所有的classloader只載入一次,載入時會先從appClassLoader載入,如果載入不到再從ExtClassLoader載入。從上到下,第一個載入類用於載入我們平常自己寫的類和classPath中引入的jar,第二個載入類用於載入jdk中的一些擴充類,工具類等。第三個c++實現的載入類用於載入java規範定義的介面和實現,也就是在我們在path中配置的rt.jar檔案
在實際應用中我們也可以自訂自己的classLoader,主要繼承classLoder這個類就可以,classLoder介面中有一些主要方法:
loadClass ,此方法用來返回已經載入到jvm的class,如果沒有則調用findClass載入,如果沒有在整個載入過程中都沒有載入上則會拋出classNotFoundException
findClass,此方法用來載入class到jvm,如果自訂載入方式的話主要就是重寫這個方法
findSystemClass,此方法調用ExtClassLoader載入類,載入不到就繼續調用c++實現的那個載入器來載入。
dfineClass,此方法用於將二進位檔案轉化為class對象,也是類載入過程是十分重要的一個方法
java 類載入機制總結