ClassLoader of Java

          乍一看到ClassLoader,我的第一感覺就是這東西好神秘啊。然后找了一下資料,略懂了一點皮毛,然后在這里和大家分享一下,這篇文章在接下來的日子里會不斷的被更新,希望會越來越完善。

          首先,我們了解一下ClassLoader是干什么用的呢?
          大家都知道,JVM解析的是Class的字節碼文件,那么JVM怎樣來加載這個字節碼文件呢,沒錯,ClassLoader負責了這項重要的工作。

          JDK中主要有以下幾種ClassLoader:

          a, Bootstrap ClassLoader/啟動類加載器
          主要負責jdk_home/lib目錄下的核心 api 或 -Xbootclasspath 選項指定的jar包裝入工作.

           

          b, Extension ClassLoader/擴展類加載器
          主要負責jdk_home/lib/ext目錄下的jar包或 -Djava.ext.dirs 指定目錄下的jar包裝入工作

           

          c, System ClassLoader/系統類加載器
          主要負責java -classpath/-Djava.class.path所指的目錄下的類與jar包裝入工作.

           

          b, User Custom ClassLoader/用戶自定義類加載器(java.lang.ClassLoader的子類)
          在程序運行期間, 通過java.lang.ClassLoader的子類動態加載class文件, 體現java動態實時類裝入特性.


          那么我們能用ClassLoader做什么事情呢?

          如果我們想動態的加載一個類,比如我們想實現一個Hot-Swap的應用,我們期望一個剛開發的高版本的Class在不關閉JVM的情況下讓它工作,此時我們就可以實現我們自己的ClassLoader,重寫里面的findClass方法。


          這里我們需要注意ClassLoader的雙親委托模式,即定義ClassLoader加載一個類之前,要先委托它的父親ClassLoader進行加載,只有當父親ClassLoader無法加載成功后,才會由自己加載。為什么要使用這種雙親委托模式呢? 


          第一個原因就是因為這樣可以避免重復加載,當父親已經加載了該類的時候,就沒有必要子ClassLoader再加載一次。 

          第二個原因就是考慮到安全因素,我們試想一下,如果不使用這種委托模式,那我們就可以隨時使用自定義的String來動態替代java核心api中定義類型,這樣會存在非常大的安全隱患,而雙親委托的方式,就可以避免這種情況,因為String已經在啟動時被加載,所以用戶自定義的ClassLoader 無法加載另外的String。

           


          參考資料:

          http://www.iteye.com/topic/136427

          http://www.iteye.com/topic/83978




          Kyle Wang

          posted on 2012-04-22 17:15 王樹東 閱讀(185) 評論(0)  編輯  收藏 所屬分類: Java Skills Learning and Sharing


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


          網站導航:
           
          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          導航

          統計

          公告

          常用鏈接

          留言簿

          隨筆分類(17)

          隨筆檔案(15)

          文章分類(4)

          文章檔案(5)

          收藏夾(4)

          Algorithm

          Design

          Environment Setup

          Installer

          Maven

          MINA

          OS

          Skills for Java

          VIM

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 荃湾区| 新津县| 南康市| 长武县| 鲜城| 茶陵县| 宝清县| 贺州市| 顺义区| 从江县| 深泽县| 宁德市| 上林县| 葵青区| 辽阳县| 广昌县| 桑植县| 仁化县| 山东省| 清远市| 天长市| 朝阳市| 元朗区| 清丰县| 库伦旗| 万山特区| 汶川县| 南陵县| 工布江达县| 甘泉县| 高密市| 台湾省| 明光市| 沙坪坝区| 惠安县| 凯里市| 札达县| 巴林左旗| 贡觉县| 西乌| 义乌市|