java類加載器-Bootstrap、 ExtClassLoader、 AppClassLoader的關係

1. 簡單介紹

 

  1. Bootstrap、 ExtClassLoader、  AppClassLoader是java最根正苗紅的類加載器。

  2. Bootstrap是本地代碼編寫的(例如C), ExtClassLoader、  AppClassLoader是java代碼,且都在rt.jar中,且很巧的都是sun.misc.Launcher內部類(不過這個不是重點)。

  3. Bootstrap是爺爺、ExtClassLoader是爸爸、AppClassLoader是孩子(孫子)。但由於爸爸ExtClassLoader太忙了,所以照顧孩子AppClassLoader的責任就有爺爺Bootstrap來處理了(即,雖然ExtClassLoader是AppClassLoader老爸,但卻是由爺爺Bootstrap加載的AppClassLoader。該情況與中國國情完全一樣)。




2. 代碼實驗

 

Java代碼  收藏代碼

  1. public class LoaderTest {  

  2.   

  3.     /** 

  4.      * @param args 

  5.      */  

  6.     public static void main(String[] args) {  

  7.   

  8.         new LoaderTest().test();  

  9.   

  10.     }  

  11.   

  12.     /** 

  13.      * @param args 

  14.      */  

  15.     public void test() {  

  16.         ClassLoader fatherLoader = this.getClass().getClassLoader();  

  17.         System.out.println("當前類的父加載器名稱:" + fatherLoader.getClass().getName());  

  18.   

  19.         // 這是因爲AppClassLoader的父加載器雖然是ExtClassLoader,但是卻是Bootstrap  

  20.         // 加載的(所以它的.getClassLoader()返回爲null)  

  21.         // Bootstrap、 ExtClassLoader、  AppClassLoader的關係很符合中國過去,可以這麼描述:ExtClassLoader是AppClassLoader的爸爸,但是AppClassLoader確實他爺爺Bootstrap一把屎一把尿喂大的。  

  22.         System.out.println("AppClassLoader的直接加載器是null嗎:"  

  23.                 + (fatherLoader.getClass().getClassLoader() == null));  

  24.   

  25.        

  26.   

  27.         ClassLoader grandfatherLoader = fatherLoader.getParent();  

  28.         System.out.println("爺爺載器名稱:" + grandfatherLoader.getClass().getName());  

  29.   

  30.     }  

  31.   

  32. }  

 

   代碼運行結果:

 

當前類的父加載器名稱:sun.misc.Launcher$AppClassLoader
AppClassLoader的加載器是null嗎:true
爺爺載器名稱:sun.misc.Launcher$ExtClassLoader

 

 


3. 類加載器各自搜索的目錄


1.Bootstrap Loader(啓動類加載器):加載System.getProperty("sun.boot.class.path")所指定的路徑或jar。通過System.out.println(System.getProperty("sun.boot.class.path"));打印,發現主要是“D:\Program Files\Java\jdk1.6.0_10\jre\lib”中的jar包。


2.Extended Loader(標準擴展類加載器ExtClassLoader):加載System.getProperty("java.ext.dirs")所指定的路徑或jar。在使用Java運行程序時,也可以指定其搜索路徑,例如:java -Djava.ext.dirs=d:\projects\testproj\classes HelloWorld。

通過打印System.out.println(System.getProperty("java.ext.dirs"));,可以發現主要加載目錄爲:

“D:\Program Files\Java\jdk1.6.0_10\jre\lib\ext;C:\WINDOWS\Sun\Java\lib\ext



3、AppClass Loader(系統類加載器AppClassLoader):加載System.getProperty("java.class.path")所指定的路徑或jar。在使用Java運行程序時,也可以加上-cp來覆蓋原有的Classpath設置,例如: java -cp ./lavasoft/classes HelloWorld

對於eclipse,就是“.classpath”中的jar包。

 

ExtClassLoader和AppClassLoader在JVM啓動後,會在JVM中保存一份,並且在程序運行中無法改變其搜索路徑。如果想在運行時從其他搜索路徑加載類,就要產生新的類加載器。


PS:這一段摘自lavasoft,地址見下。

 

 

參考:

http://hi.baidu.com/haifengjava/blog/item/498fd8365ef5c8390a55a9db.html

http://lavasoft.blog.51cto.com/62575/184547


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章