qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          Java類加載器以及類加載器的委托模型

           我們知道,我們在Java中用到的所有的類都是通過類加載器ClassLoader加載到JVM中的,我們還知道類加載器也對應著一個類,既然這樣那么我們會想那么ClassLoader類是由誰加載的呢?

            其實在Java中有許許多多的類加載器,我們甚至可以寫自己的類加載器。

            其中主要三個類加載器(他們是樹形關系)是:

            BootStrap:在java虛擬機啟動的時候會利用這個類加載器來加載 JDK安裝目錄下的 /JRE/LIB/rt.jar 也就是系統默認導入的一些類例如System類,這個類加載器不是類 。只是作為一個java中類的起源工具。

            ExpClassLoader:這個類加載器加載JDK安裝目錄下的/JRE/LIB/ext 目錄中的類 我們只要把我們的類打包成JAR包放在這里即可。

            AppClassLoader:我們在java程序中classpath對應的類都有這個AppClassLoader導入進來。

            看下面一段代碼:

          1. package me.test;  
          2. /** 
          3. *   BootStrap   
          4. *   加載  JRE/lib/rt.jar 包中的類   包括我們常用到的類 
          5. *   
          6. *   ExtClassLoader 
          7. *   專門家在 JDK/JRE/libEXT/*.jar  中的類  只要把我們的類放在這里 就會被 這個加載器加載  
          8. * 
          9. *   AppClassLoader   
          10. *   加載ClassPath指定的所有jar和目錄 
          11. * 
          12. * **/ 
          13. public class Test1  
          14. {    
          15. public static void main(String []args)  
          16. {  
          17.      
          18.   System.out.println(Test1.class.getClassLoader().getClass().getName() );    //獲取主類的類加載器 
          19.   System.out.println(System.class.getClassLoader()); 
          20. //BootStrap    獲取System類的類加載器  因為加載器是 BootStrap所以返回null  以為內他不是一個類 
          21.   ClassLoader l=Test1.class.getClassLoader() ;  //獲取Test1的類加載器 
          22.   while(l!=null)   //循環出 ClassLoader樹 
          23.   {  
          24.    System.out.println(l.getClass().getName());    
          25.    l=l.getParent();  
          26.   }  
          27.    
          28.   System.out.println(l);  
          29.    
          30. }  
          31. }

            ClassLoader的委托模型

            比如說我們在加載一個類的時候AppClassLoader他先讓BootStrap來加載類,如果BootStrap已經加載了,那么就返回。如果找不到這個類那么BootStrap就傳遞給ExtClassLoader 來查找,和BootStrap一樣。如果找到就加載,如果找不到就繼續傳遞給AppClassLoader 來加載。如果AppClassLoader還找不到的話,那么AppClassLoader就會跑出ClassNotFoundException 異常。

            我們為什么不利用AppClassLoader下級的加載器呢?因為AppClassLoader下級可能有多個類加載器多個類加載器相互獨立,如果加載類那么就會導致內存中出現多份字節碼,造成不必要的的內存浪費。這就是類加載器的委托模型。

          posted on 2012-02-21 16:57 順其自然EVO 閱讀(178) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
          博客園   IT新聞   Chat2DB   C++博客   博問  
           
          <2012年2月>
          2930311234
          567891011
          12131415161718
          19202122232425
          26272829123
          45678910

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 黎川县| 平舆县| 邹平县| 永仁县| 广南县| 高雄市| 台湾省| 苏州市| 遵义市| 丁青县| 祥云县| 大化| 玉树县| 卫辉市| 明溪县| 多伦县| 克拉玛依市| 朔州市| 大丰市| 大荔县| 潞西市| 广南县| 安乡县| 通辽市| 利津县| 汪清县| 南京市| 马龙县| 托里县| 财经| 河西区| 盈江县| 元氏县| 晋江市| 西充县| 山阴县| 舞钢市| 荥经县| 鄯善县| 丰顺县| 城步|