早餐2塊2

          if(!java.isExist()) boss.fireOut(me);

          導航

          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          公告

          本站所有文章如有署名:早餐2塊2,皆出自本人親筆,文章內容都系本人個人之見解,難免有所疏漏,對于文章所闡述的內容本人概不負責!本站已署名或未署名的文章皆來自于互聯網,如果文章作者認為侵害其權益,可以致信:formatmyself@hotmail.com聯系,本人會盡快將其刪除,并致以誠摯的歉意!謝謝

          文章分類

          收藏夾

          文章檔案

          相冊

          統計

          留言簿(1)

          積分與排名

          閱讀排行榜

          評論排行榜

          對于java類加載器的認識(2)

                  讓我們先回到java的動態性,實現java的動態性有兩種方法類型:一種是隱式,另一種是顯式。什么是隱式?new 這個關鍵字我們都認識,當我們用其將類實例化時(即將對象載入),這種就是隱式!我們再來看顯式的實現方法,一種可以由java.long.Class里面的forName()方法將類實例化,其中也用到了類加載器,詳情見:認識java的Class類,另一種是由也就是直接用類加載器ClassLoader來實現。
                 ClassLoader一些重要的方法
                  A)  方法 loadClass
                  ClassLoader.loadClass() 是 ClassLoader 的入口點。該方法的定義如下:
                  Class loadClass( String name, boolean resolve );
                  參數name  JVM 需要的類的名稱,如 Person 或 java.lang.Object。
                  參數 resolve 參數告訴方法是否需要解析類。在準備執行類之前,應考慮類解析。并不總是需要解析。如果 JVM 只需要知道該類是否存在或找出該類的超類,那么就不需要解析詳情見:認識java的Class類 中的forName()方法的介紹。 
                  B)  方法 defineClass
                 defineClass 方法是 ClassLoader 的主要訣竅。該方法接受由原始字節組成的數組并把它轉換成 Class 對象。原始數組包含如從文件系統或網絡裝入的數據。defineClass 管理 JVM 的許多復雜、神秘和倚賴于實現的方面 -- 它把字節碼分析成運行時數據結構、校驗有效性等等。不必擔心,您無需親自編寫它。事實上,即使您想要這么做也不能覆蓋它,因為它已被標記成final的。 
                 C)  方法 findSystemClass
                   findSystemClass 方法從本地文件系統裝入文件。它在本地文件系統中尋找類文件,如果存在,就使用 defineClass 將原始字節轉換成 Class 對象,以將該文件轉換成類。當運行 Java 應用程序時,這是 JVM 正常裝入類的缺省機制。(Java 2 中 ClassLoader 的變動提供了關于 Java 版本 1.2 這個過程變動的詳細信息。) 對于定制的 ClassLoader,只有在嘗試其它方法裝入類之后,再使用 findSystemClass。原因很簡單:ClassLoader 是負責執行裝入類的特殊步驟,不是負責所有類。例如,即使 ClassLoader 從遠程的 Web 站點裝入了某些類,仍然需要在本地機器上裝入大量的基本 Java 庫。而這些類不是我們所關心的,所以要 JVM 以缺省方式裝入它們:從本地文件系統。這就是 findSystemClass 的用途。 
                 D) 方法 resolveClass
                 正如前面所提到的,可以不完全地(不帶解析)裝入類,也可以完全地(帶解析)裝入類。當編寫我們自己的 loadClass 時,可以調用 resolveClass,這取決于 loadClass 的 resolve 參數的值。 
                E) 方法 findLoadedClass 
                 findLoadedClass 充當一個緩存:當請求 loadClass 裝入類時,它調用該方法來查看 ClassLoader 是否已裝入這個類,這樣可以避免重新裝入已存在類所造成的麻煩。應首先調用該方法。

          怎么組裝這些方法
            1) 調用 findLoadedClass 來查看是否存在已裝入的類。
            2) 如果沒有,那么采用那種特殊的神奇方式來獲取原始字節。
            3) 如果已有原始字節,調用 defineClass 將它們轉換成 Class 對象。
            4) 如果沒有原始字節,然后調用 findSystemClass 查看是否從本地文件系統獲取類。
            5) 如果 resolve 參數是 true,那么調用 resolveClass 解析 Class 對象。
            6) 如果還沒有類,返回 ClassNotFoundException。

          Java 2 中 ClassLoader 的變動
          1)loadClass 的缺省實現
             定制編寫的 loadClass 方法一般嘗試幾種方式來裝入所請求的類,如果您編寫許多類,會發現一次次地在相同的、很復雜的方法上編寫變量。 在 Java 1.2 中 loadClass 的實現嵌入了大多數查找類的一般方法,并使您通過覆蓋 findClass 方法來定制它,在適當的時候 findClass 會調用 loadClass。 這種方式的好處是您可能不一定要覆蓋 loadClass;只要覆蓋 findClass 就行了,這減少了工作量。

          2)新方法:findClass
               loadClass 的缺省實現調用這個新方法。findClass 的用途包含您的 ClassLoader 的所有特殊代碼,而無需要復制其它代碼(例如,當專門的方法失敗時,調用系統 ClassLoader)。

          3) 新方法:getSystemClassLoader
               如果覆蓋 findClass 或 loadClass,getSystemClassLoader 使您能以實際 ClassLoader 對象來訪問系統 ClassLoader(而不是固定的從 findSystemClass 調用它)。
           
          4) 新方法:getParent 
              為了將類請求委托給父代 ClassLoader,這個新方法允許 ClassLoader 獲取它的父代 ClassLoader。當使用特殊方法,定制的 ClassLoader 不能找到類時,可以使用這種方法。
          父代 ClassLoader 被定義成創建該 ClassLoader 所包含代碼的對象的 ClassLoader。   





          posted on 2005-11-24 18:40 早餐2塊2 閱讀(905) 評論(0)  編輯  收藏 所屬分類: java基礎

          主站蜘蛛池模板: 利辛县| 岱山县| 民和| 鄱阳县| 南川市| 漯河市| 渭源县| 宝山区| 吉首市| 大悟县| 安丘市| 黑龙江省| 东乡族自治县| 益阳市| 建始县| 内乡县| 濮阳县| 武平县| 嘉定区| 乃东县| 长沙市| 奎屯市| 寻甸| 景德镇市| 台州市| 岳池县| 无极县| 诏安县| 金川县| 台东市| 常熟市| 桃江县| 龙州县| 高邮市| 凤阳县| 文登市| 宜兴市| 安吉县| 鹿泉市| 根河市| 荃湾区|