cuiyi's blog(崔毅 crazycy)

          記錄點滴 鑒往事之得失 以資于發展

          導航

          我參與的團隊

          隨筆分類

          相冊

          積分與排名

          • 積分 - 671945
          • 排名 - 70

          最新評論

          閱讀排行榜

          ClassLoader專題(一):ClassLoader基礎

          ClassLoader 專題(一): ClassLoader 基礎

          ClassLoader 專題(二):從 Servlet 容器看 ClassLoader 機制的妙用
              ClassLoader專題(三):引文 

           

          JVM啟動,會形成3個類加載器組成的初始化加載器層次結構:
          bootstap classloader (加載核心類)
                  ||
          extension classloader(加載ext(目錄),即java.ext.dirs())
                  ||
          system classloader   (加載-classpath或者java.class.path或者CLASSPATH)


          ClassLoader機制:
          a)全盤負責:一個classloader加載一個class后,這個class所引用或者依賴的類也由這個classloader載入,除非顯示的用另一個classloader載入
          b)委托機制:先由父加載器加載,除非父加載器找不到時才從自己的類路徑中去尋找
          c)Cache機制:classloader采用緩存機制,即先查cache;若cache中保存了這個class就直接返回;若無,才從文件讀取和轉化為class并放入cache

           

          ClassLoader加載類順序:
          1)檢查cache是否有該類:
              11)若有直接返回
              12)若無,請求父類加載
                  121) 若無父,則從bootstap classloader加載
          2)加載:
              21)尋找class文件(叢與此classloader相關的類路徑中尋找)
              22)從文件載入class
              23)找不到則拋出ClassNotFoundeException
          3)擴展:
              記載時即2),覆寫findClass可以實現自己的載入策略
              記載時即2),覆寫loadClass來實現自己的載入過程


          如何實現運行時動態載入與更新
          本質:只要動態改類搜索路徑和清除classloader的cache已載入的class就ok
          做法:
          1)繼承ClassLoader:覆寫loadClass方法,動態尋找class文件
          2)只要重新使用一個新的類搜索路徑來new一個classloader就可以,這樣既更新了類的搜索路徑以便來載入新的class,也更新生成了一個空白的cache


          classloader載入的方式
          1)Pre-loading 預先載入,載入基礎類
          2)load-on-demand 按需求載入


          JDK為啥有兩個JRE?
          JDK中jre是運行java本身的程序,如javac
          ProgramFile(默認安裝)中jre是運行用戶編寫的java程序

          posted on 2007-02-01 20:48 crazycy 閱讀(5084) 評論(5)  編輯  收藏 所屬分類: JavaSE語言

          評論

          # re: ClassLoader專題一:ClassLoader基礎  回復  更多評論   

          ContextClassloader也很重要,

          JDK為啥2個JRE?
          看這里http://java.sun.com/javase/6/docs/
          JDK本身包含一個JRE.
          放在programfile只是為了方便,沒有區別.
          Unix-like系統里面一般安裝就只有一個jre,也就是jdk里面的那個jre.
          2007-02-01 21:02 | colorzhang

          # re: ClassLoader專題(一):ClassLoader基礎  回復  更多評論   

          研究好了 ClassLoader 可以給自己的應用加入熱切換, 熱部署, 熱替換功能, 那樣就是高高手了!
          2007-02-03 19:56 | BeanSoft

          # re: ClassLoader專題(一):ClassLoader基礎  回復  更多評論   

          @BeanSoft
          甚是啊
          潛心修行中
          2007-05-05 01:32 | crazycy

          # re: ClassLoader專題(一):ClassLoader基礎  回復  更多評論   

          @colorzhang
          這個地方受教了;

          programfile 下的jre主要為ie等服務,呵呵
          2007-05-05 01:33 | crazycy

          # re: ClassLoader專題(一):ClassLoader基礎  回復  更多評論   

          請教下:
          2)只要重新使用一個新的類搜索路徑來new一個classloader就可以,這樣既更新了類的搜索路徑以便來載入新的class,也更新生成了一個空白的cache

          “重新使用一個新的類搜索路徑” , 這句是什么意思 ,能舉個例子么?
          2008-11-05 14:02 | hackerZxf
          主站蜘蛛池模板: 石泉县| 大理市| 武冈市| 镇原县| 买车| 陆河县| 寿阳县| 洞头县| 长寿区| 水富县| 昭觉县| 衡阳县| 安塞县| 定西市| 金沙县| 改则县| 晴隆县| 获嘉县| 萝北县| 长治县| 简阳市| 雷州市| 蒙城县| 漾濞| 兰考县| 大宁县| 阳江市| 海淀区| 祥云县| 山阴县| 蓝山县| 民乐县| 广昌县| 怀化市| 甘泉县| 喀什市| 富裕县| 连江县| 通河县| 万全县| 乾安县|