cuiyi's blog(崔毅 crazycy)

          記錄點滴 鑒往事之得失 以資于發(fā)展
          數(shù)據(jù)加載中……

          ClassLoader專題(一):ClassLoader基礎(chǔ)

          ClassLoader 專題(一): ClassLoader 基礎(chǔ)

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

           

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


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

           

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


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


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


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

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

          評論

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

          ContextClassloader也很重要,

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

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

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

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

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

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

          @colorzhang
          這個地方受教了;

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

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

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

          “重新使用一個新的類搜索路徑” , 這句是什么意思 ,能舉個例子么?
          2008-11-05 14:02 | hackerZxf
          主站蜘蛛池模板: 温宿县| 舟山市| 三穗县| 高密市| 台湾省| 剑川县| 林口县| 吉木乃县| 高安市| 灵山县| 安西县| 天镇县| 开封县| 阳朔县| 黔江区| 呼图壁县| 西宁市| 沙河市| 堆龙德庆县| 山东| 清新县| 汝城县| 资兴市| 张家口市| 白朗县| 克东县| 崇信县| 平和县| 页游| 西平县| 德令哈市| 滕州市| 建水县| 和林格尔县| 卓尼县| 宝坻区| 孝感市| 姚安县| 雷山县| 龙井市| 象山县|