關(guān)于java class loader的理解筆記

          Posted on 2007-04-03 12:27 久城 閱讀(2539) 評(píng)論(3)  編輯  收藏 所屬分類: Java理解筆記

          JAVA中的一切都是以類的形式存在的(除少數(shù)底層的東西,那些我就不清楚是怎么回事了)。我們運(yùn)行的接口是一個(gè)類,運(yùn)行中所涉及到的對(duì)象也都是類對(duì)象。下面,我們來(lái)研究下,我所理解的類的加載機(jī)制。

          比如我們有一個(gè)Student類,也就是經(jīng)過(guò)編譯后,是一個(gè)Student.class文件。當(dāng)我們的程序運(yùn)行的過(guò)程中,第一次實(shí)例化一個(gè)student對(duì)象的時(shí)候,系統(tǒng)首先要做的就是加載Student這個(gè)類。也就是把Student.class以字節(jié)瑪?shù)男蝿?shì)加載到內(nèi)存中(并通過(guò)defineClass()這個(gè)方法轉(zhuǎn)變成Class對(duì)象,最終以Class對(duì)象的形式存儲(chǔ)在內(nèi)存中)。這個(gè)加載的過(guò)程就是由類加載器來(lái)完成的。

          一般的,在程序啟動(dòng)之后,系統(tǒng)會(huì)主要會(huì)有三個(gè)類加載器:Bootstrap Loader、ExtClassLoader與AppClassLoader。

          Bootstrap Loader是由C++撰寫(xiě)的,它主要負(fù)責(zé)搜索JRE所在目錄的classes或lib目錄下的.jar文件(例如rt.jar)是否需要被加載(實(shí)際上是由系統(tǒng)參數(shù)sun.boot.class.path來(lái)指定);ExtClassLoader主要負(fù)責(zé)搜索JRE所在目錄的lib/ext 目錄下的classes或.jar中是否需要被加載(實(shí)際上是由系統(tǒng)參數(shù)java.ext.dirs指定);AppClassLoader則是搜索 Classpath中是否有指定的classes需要被載入(由系統(tǒng)參數(shù)java.class.path指定)。

          簡(jiǎn)單的說(shuō),Bootstrap Loader、ExtClassLoader這兩個(gè)類加載器,主要是加載系統(tǒng)類庫(kù)里的類。我們自己編輯的類一般都是由AppClassLoader來(lái)加載。當(dāng)我們遇到如下代碼的時(shí)候:

          Student stu  = new Student();
          //實(shí)例化一個(gè)Student類的對(duì)象stu

          AppClassLoader首先會(huì)到classpath下去尋找Student.class文件。(找不到則會(huì)拋出ClassNotFoundException異常)找到之后便會(huì)把Student這個(gè)類以二進(jìn)制的形式存儲(chǔ)到內(nèi)存中。這個(gè)過(guò)程也就是對(duì)Student類加載的過(guò)程。然后用我們加載到內(nèi)存中的Student類去實(shí)例化一個(gè)Student對(duì)象stu。

          以上就是所謂的隱式的類的加載過(guò)程。但是有些時(shí)候需要我們自定義一個(gè)類的加載器,這個(gè)時(shí)候就需要我們模仿這個(gè)過(guò)程,顯示的加載我們自己所需要的類。比如,我們自定義一個(gè)類的加載器MyClassLoader,那我們利用我們自定義的這個(gè)加載器,顯示的去加載一個(gè)類的過(guò)程也是這樣的:

          1.尋找類文件。
          這里的靈活性比較大,我們可以自己去設(shè)計(jì)如何去尋找類文件以及去哪里尋找類文件。比如一些非本地的類文件,通過(guò)系統(tǒng)的類加載器無(wú)法加載到這些類,這個(gè)時(shí)候,我們就可以利用自定義的類加載器指定路徑去尋找。
          2.加載類文件。
          找到我們所要加載的類之后,通過(guò)MyClassLoader的defineClass()方法,把這個(gè)類加載到指定的內(nèi)存中。這里我們可以自己設(shè)定存儲(chǔ)類的內(nèi)存空間,比如把我們加載的類都統(tǒng)一放到一個(gè)變量數(shù)組里(至于系統(tǒng)的類加載到內(nèi)存中是以什么樣的形式存儲(chǔ)再內(nèi)存中的,我還不清楚,只知道是以二進(jìn)制的形式保存的,可以用一個(gè)Class對(duì)象去引用)。
          3.創(chuàng)建類對(duì)象。
          我接觸的時(shí)候還不大理解,其實(shí)這里是應(yīng)用我們自己加載到內(nèi)存中的類,去實(shí)例化一個(gè)對(duì)象。以下代碼可以參考:

          import java.net.MalformedURLException;
          import java.net.URL;

          class MyClassLoader {
              
          public static void main(String[] args) throws MalformedURLException,
                      ClassNotFoundException 
          {
                  URL url1 
          = new URL("file:/d:/workspace/");
                  
          // 指定路徑,相當(dāng)于classpath的意思。
                  myClassLoader myClassLoader = new MyClassLoader(new URL[] { url1 });
                  
          // 用這個(gè)路徑創(chuàng)建一個(gè)myClassLoader對(duì)象。這里隨你所定義的ClassLoader而定。
                  Class c1 = myClassLoader.loadClass("Student");
                  
          // 用自定義的類加載器,去顯式的加載一個(gè)類。返回一個(gè)Class對(duì)象。
                  Student stu = c1.newInstance();
                  
          // 用這個(gè)Class對(duì)象就可以產(chǎn)生一個(gè)ClassLoaderTest的實(shí)例。
              }

          }

          正在學(xué)習(xí)中,理解的還不夠準(zhǔn)確。保持更新。

          歡迎來(lái)訪!^.^!
          本BLOG僅用于個(gè)人學(xué)習(xí)交流!
          目的在于記錄個(gè)人成長(zhǎng).
          所有文字均屬于個(gè)人理解.
          如有錯(cuò)誤,望多多指教!不勝感激!

          Feedback

          # re: 關(guān)于java class loader的理解筆記  回復(fù)  更多評(píng)論   

          2007-04-11 14:27 by Web 2.0 技術(shù)資源
          好玩!!!!!!!!

          # re: 關(guān)于java class loader的理解筆記  回復(fù)  更多評(píng)論   

          2007-04-16 19:18 by liji
          猴子的粑粑 ---緣分啊!
          這都能碰到,這么短的時(shí)間你就能理解到這個(gè)層次,佩服:D 你太有才了,呵呵,學(xué)習(xí) - -

          # re: 關(guān)于java class loader的理解筆記[未登錄](méi)  回復(fù)  更多評(píng)論   

          2008-11-05 22:59 by Scott
          AppClassLoader首先會(huì)到classpath下去尋找Student.class文件,應(yīng)該是AppClassLoader會(huì)調(diào)用父loader去加載,沒(méi)加載到的話才會(huì)由AppClassLoader去加載, JDK doc 引用如下:


          The ClassLoader class uses a delegation model to search for classes and resources. Each instance of ClassLoader has an associated parent class loader. When called upon to find a class or resource, a ClassLoader instance will delegate the search for the class or resource to its parent class loader before attempting to find the class or resource itself. The virtual machine's built-in class loader, called the bootstrap class loader, does not itself have a parent but may serve as the parent of a ClassLoader instance

          Copyright © 久城

          主站蜘蛛池模板: 普兰县| 天津市| 壶关县| 昆明市| 武宣县| 浦县| 白城市| 吉木乃县| 清原| 炎陵县| 翼城县| 如东县| 南充市| 吉首市| 黔江区| 永德县| 银川市| 白沙| 邢台市| 兰溪市| 高安市| 崇文区| 陵水| 剑川县| 东宁县| 西丰县| 仙居县| 彰化县| 嘉义市| 临城县| 平和县| 濮阳县| 兴业县| 遂川县| 元氏县| 洪泽县| 新化县| 德钦县| 乌拉特前旗| 珠海市| 晋宁县|