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 閱讀(179) 評論(0)  編輯  收藏


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


          網站導航:
           
          <2012年2月>
          2930311234
          567891011
          12131415161718
          19202122232425
          26272829123
          45678910

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 乌鲁木齐市| 峡江县| 西乡县| 资源县| 英德市| 武陟县| 承德市| 泾川县| 壤塘县| 兴宁市| 建平县| 日喀则市| 彭州市| 丽江市| 望江县| 昭觉县| 南皮县| 如东县| 南岸区| 宜川县| 安宁市| 乡宁县| 泰顺县| 宣恩县| 安多县| 广安市| 筠连县| 神农架林区| 上杭县| 定兴县| 黔西| 麻城市| 阿拉善右旗| 唐海县| 嘉黎县| 津市市| 平山县| 政和县| 湘乡市| 米脂县| 南涧|