classLoader加載class的流程

如下是針對sun的hotspot,固然如今sun已被oracle收購java

Java在須要使用類的時候纔會將其載入,Java的類載入是由Classloader來執行的。mysql

如今以win下執行java xxx來說解下流程:sql

  1. 首先java執行文件會嘗試找到JRE安裝的所在目錄,而後尋找jvm.dll(預設是在JRE目錄下bin\client目錄中,好比C:\Java\jdk1.7.0_07\jre\bin\client\jvm.dll和C:\Java\jdk1.7.0_07\jre\bin\server\jvm.dll)oracle

  2. 接着啓動JVM並執行初始化動做,產生Bootstrap ClassLoadereclipse

  3. Bootstrap Loader會載入Extended ClassLoader,並設定Extended ClassLoader的parent爲Bootstrap ClassLoaderjvm

  4. 接着Bootstrap ClassLoader會載入App ClassLoader(System ClassLoader,並將App ClassLoader的parent設定爲Extended ClassLoaderspa

  5. 接着App ClassLoader開始載入指定的類。注意這裏有個「雙親委派模型」的概念,就是在載入類時,都是先交於parent類ClassLoader去加載,若是找到了就直接 返回,不然才本身來加載,本身也加載不到就拋出ClassNotFoundException,見圖:.net


注意,這個三個ClassLoader類之間的父子關係(不是繼承關係),僅是語義上的關係,Extended ClassLoader 和 App ClassLoader都是java.net.URLClassLoader的子類。見code

public class ClassLoaderTest
{
	public static void main(String[] args)
	{
		ClassLoaderTest ct = new ClassLoaderTest();
		System.out.println(ct.getClass().getClassLoader()); //sun.misc.Launcher$AppClassLoader@1bbf1ca
		System.out.println(ct.getClass().getClassLoader().getParent()); //sun.misc.Launcher$ExtClassLoader@1ff0dde
		System.out.println(ct.getClass().getClassLoader().getParent().getParent()); // null
		// 因爲這些系統lib中的類是由BootStrap加載的,它並非一個類,因此沒法獲取ClassLoader
		System.out.println(System.class.getClassLoader()); // null
		//App ClassLoader的父類爲java.net.URLClassLoader
		System.out.println(ct.getClass().getClassLoader().getClass().getSuperclass().getName());//java.net.URLClassLoader
		//Extended ClassLoader的父類爲java.net.URLClassLoader
		System.out.println(ct.getClass().getClassLoader().getParent().getClass().getSuperclass().getName());//java.net.URLClassLoader
	}
}

可見第8行爲null,由於Bootstrap ClassLoader是C++編寫server


可見JVM中默認的classloader有Bootstrap ClassLoader、Extended ClassLoader、App ClassLoader

  1. Bootstrap ClassLoader:負責加載java基礎類,主要是 %JRE_HOME/lib/ 目錄下的jar和class,即系統參數sun.boot.class.path下的jar和類。System.getProperty("sun.boot.class.path")可查看詳細,我電腦顯示以下:

    C:\Program Files (x86)\Java\jre7\lib\resources.jar;

    C:\Program Files (x86)\Java\jre7\lib\rt.jar;

    C:\Program Files (x86)\Java\jre7\lib\sunrsasign.jar;

    C:\Program Files (x86)\Java\jre7\lib\jsse.jar;

    C:\Program Files (x86)\Java\jre7\lib\jce.jar;

    C:\Program Files (x86)\Java\jre7\lib\charsets.jar;

    C:\Program Files (x86)\Java\jre7\lib\jfr.jar;

    C:\Program Files (x86)\Java\jre7\classes

  2. Extended ClassLoader:負責加載java擴展類,主要是 %JRE_HOME/lib/ext 目錄下的jar和class等,即系統參數java.ext.dirs下的jar和類,System.getProperty("java.ext.dirs")可查看詳細,我電腦顯示以下:

    C:\Program Files (x86)\Java\jre7\lib\ext;

    C:\Windows\Sun\Java\lib\ext

  3. App ClassLoader:負責加載當前java應用的classpath中的全部類。即系統參數java.class.path下的jar和類,System.getProperty("java.class.path")可查看詳細,我電腦顯示以下:

    D:\soft\eclipse\workspace\test\bin;

    D:\soft\eclipse\workspace\test\lib\commons-logging-1.0.4.jar;

    D:\soft\eclipse\workspace\test\lib\commons-cli-1.2.jar;

    D:\soft\eclipse\workspace\test\lib\mysql-connector-java-5.1.28-bin.jar;

    。。。

  4. 1

相關文章
相關標籤/搜索