Java的類載入器初學習

yoyochina發表於2009-01-07

      Java在需要使用類的時候,才會將類載入,Java的類載入是由類載入器來完成的。

      在載入類時,每個類載入器會先將類的載入任務交給其parent,如果parent找不到,再由自己負責載入。即在載入類時,會以Bootstrap Loader——>Extended Loader——>System Loader的順序來尋找類,如果都找不到,就會丟出NoClassDefFoundError。需要注意到是,Bootstrap Loader通常由C編寫而成,而Extended Loader和System Loader是由Java編寫而成,下面的程式碼中某個輸出語句列印出null就是這個原因。

      當在命令列模式下執行java XX.class指令後,java執行程式會嘗試找到JRE安裝目錄,尋找jvm.dll,啟動JVM並進行初始化,產生Bootstrap Loader,接著Bootstrap Loader載入Extended Loader和System Loader,並設定Extended Loader的parent為Bootstrap Loader,而System Loader定parent為Extended Loader,最後再載入XX.class。

 

public class classLoaderTest 
{
	public static void main(String[] args)
	{
		classLoaderTest test = new classLoaderTest();
		
		Class<?> c = test.getClass();
		
		ClassLoader loader = c.getClassLoader();
		
		System.out.println(loader);		
		System.out.println(loader.getParent());		
		System.out.println(loader.getParent().getParent());  //輸出為:null
	
		System.out.println(System.getProperty("sun.boot.class.path"));
		System.out.println(System.getProperty("java.ext.dirs"));
		System.out.println(System.getProperty("java.class.path"));
	}
}

   

   我的機子中的執行結果如下:

  

sun.misc.Launcher$AppClassLoader@19821f
sun.misc.Launcher$ExtClassLoader@addbf1
null
D:\Program Files\Java\jdk1.6.0_02\jre\lib\resources.jar;D:\Program Files\Java\jdk1.6.0_02\jre\lib\rt.jar;D:\Program Files\Java\jdk1.6.0_02\jre\lib\sunrsasign.jar;D:\Program Files\Java\jdk1.6.0_02\jre\lib\jsse.jar;D:\Program Files\Java\jdk1.6.0_02\jre\lib\jce.jar;D:\Program Files\Java\jdk1.6.0_02\jre\lib\charsets.jar;D:\Program Files\Java\jdk1.6.0_02\jre\classes
D:\Program Files\Java\jdk1.6.0_02\jre\lib\ext;C:\WINDOWS\Sun\Java\lib\ext
D:\workspace\Test\bin

 

    如果把classLoaderTest的.class檔案放在其他的目錄下,會有不同的執行結果。

 

相關文章