<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Roger Tu

    A simple boy living a simple life in every simple day...

       ::  :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      7 隨筆 :: 0 文章 :: 19 評論 :: 0 Trackbacks

    基本原理

    所有類都由類裝載器載入,載入內存中的類對應一個 java.lang.Class 實例。

    已被加載的類由該類的類加載器實例與該類的全路徑名的組合標識。設有 packagename.A Class ,分別被類加載器 CL1 CL2 加載,則系統(tǒng)中有兩個不同的 java.lang.Class 實例: <CL1, packagename.A> <CL2, packagename.A> 。

    存在一個 Bootstrap Loader (以下簡稱為 BL ),由 C++ 寫成,負責在虛擬機啟動后一次

    性加載 Java 基礎類庫中的所有類。其他的類裝載器由 Java 寫成,都是 java.lang.ClassLoader 的子類。

    BL 之外的所有類裝載器都有一個 parent 屬性,指向其父裝載器。查閱 java.lang.ClassLoader 的源碼,不難發(fā)現(xiàn)類裝載器的委托裝載方式。

    ? ?? protected synchronized Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException

    ??? {

    ???? ???? // First, check if the class has already been loaded

    ???? ???? Class c = findLoadedClass(name);

    ???? ???? if (c == null ) {

    ???? ??? ???? try {

    ???????? ???? ???? if ( parent != null ) {

    ???????? ??? ???? ???? c = parent .loadClass(name, false );

    ???????? ???? ???? } else {

    ???????? ??? ???? ???? c = findBootstrapClass0(name);

    ???????? ???? ???? }

    ???? ??? ???? } catch (ClassNotFoundException e) {

    ???? ??????? ???? // If still not found, then invoke findClass in order

    ???? ??????? ???? // to find the class.

    ???? ??????? ???? c = findClass(name);

    ???? ??? ???? }

    ???? ???? }

    ???? ???? if (resolve) {

    ???? ??? ???? resolveClass(c);

    ???? ???? }

    ???? ???? return c;

    ??? }

    ?????? 對于給定的類名,首先檢查自己是否已加載過該類。如果沒有,則首先通過父裝載器加載(如果 parent==null ,則直接通過 BL 來加載,相當于 BL 是其父裝載器)。如果父裝載器也無法裝載,才真正調用自己的 findClass() 方法來裝載。

    ?????? Java 基礎類在 Java 虛擬機啟動后由 BL 一次性載入。構成 Java 應用程序的其它類在程序運行過程中由不同類裝載器按需通過 loadClass() 方法裝載。

    Java 程序啟動過程中的類裝載器

    當執(zhí)行“ java XXX.class ”時, java.exe 首先找到 JRE Java Runtime Environment ),接著找到位于 JRE 之中的 jvm.dll ,最后載入 jvm.dll 并啟動虛擬機。

    虛擬機一啟動,先做一些初始化動作,如獲取系統(tǒng)參數(shù)等,然后產(chǎn)生 BL 。 BL 加載 Java 基礎類,這些類都存放在 JRE 中的 lib 目錄下,可由 System.getProperty(“sun.boot.class.path”) 列出,如:

    C:\Program Files\Java\jre1.5.0_09\lib\rt.jar;

    C:\Program Files\Java\jre1.5.0_09\lib\i18n.jar;

    C:\Program Files\Java\jre1.5.0_09\lib\sunrsasign.jar;

    C:\Program Files\Java\jre1.5.0_09\lib\jsse.jar;

    C:\Program Files\Java\jre1.5.0_09\lib\jce.jar;

    C:\Program Files\Java\jre1.5.0_09\lib\charsets.jar;

    C:\Program Files\Java\jre1.5.0_09\classes

    ?????? BL 然后創(chuàng)建 sun.misc.Launcher$ExtClassLoader ExtClassLoader 是定義于 sun.misc.Launcher 之內的內部類,繼承自 java.lang.URLClassLoader )的實例(以下簡稱 EL )和 sun.misc.Launcher$AppClassLoader AppClassLoader 是定義于 sun.misc.Launcher 之內的內部類,繼承自 URLClassLoader )的實例(以下簡稱 AL ),并將 EL parent 屬性設置為 null , AL parent 屬性設置為 EL

    ?????? EL 在程序運行過程中按需加載保存在 JRE 的“ \lib\ext ”目錄下的類。該目錄可由 System.getProperty(“java.ext.dirs”) 讀出,如

    C:\Program Files\Java\jre1.5.0_09\lib\ext

    ?????? AL 在程序運行過程中按需加載的類搜索路徑則是從系統(tǒng)參數(shù) java.class.path 取出的字符串。 java.class.path 是由我們在執(zhí)行 java.exe 時,利用 -cp -classpath CLASSPATH 環(huán)境變量所決定。我們應用程序用到的非 JRE 提供類的搜索路徑一般都配置在 java.class.path 中。

    什么時候裝載類,由什么類裝載器裝載

    1.? Java 基礎類由 BL 在虛擬機啟動時一次性載入。

    2.? 包含 main() 的入口類由 AL loadClass() 方法載入。

    3.? new 關鍵字創(chuàng)建一個類的實例。該類由運行時刻包含該 new 語句的類實例的類裝載器( ClassLoader.getCallerClassLoader() )的 loadClass() 方法載入。

    4.? 調用 Class.forName() 方法。完整的 forName() 函數(shù)版本有一個 ClassLoader 參數(shù),用于指定用什么類裝載器來裝載指定類。

    ??? public static Class<?> forName(String name, boolean initialize,

    ????????????? ?? ClassLoader loader) throws ClassNotFoundException

    ?????? 對于 public static Class<?> forName(String className) 版本,是由運行時刻包含該語句的類實例的類裝載器( ClassLoader.getCallerClassLoader() )的 loadClass() 方法載入。

    5.? 調用某個 ClassLoader 實例的 loadClass() 方法。通過該 ClassLoader 實例的 loadClass() 方法載入。應用程序可以通過繼承 ClassLoader 實現(xiàn)自己的類裝載器。

    6 .裝載一個類時,首先要裝載該類的基類及其接口。

    posted on 2007-03-07 00:45 RogerTu 閱讀(4464) 評論(5)  編輯  收藏 所屬分類: JAVA

    評論

    # re: Java類裝載機制要義[未登錄] 2007-03-08 13:20 lendo
    不錯  回復  更多評論
      

    # re: Java類裝載機制要義 2008-02-25 14:26 goohool
    “Bootstrap Loader (以下簡稱為 BL )”,java的東西居然是用c++寫的,這個和平臺有關系嗎?希望得到你的解答,謝謝。我的E-mail:goohool@163.com  回復  更多評論
      

    # re: Java類裝載機制要義[未登錄] 2009-03-03 10:34 abc
    c++寫的東西肯定是平臺依賴的,但是要注意bl是jvm的東西,jvm是依據(jù)不同平臺而寫的;java之所以能運行在各個平臺而不需要重新編譯是因為jvm的存在  回復  更多評論
      

    # re: Java類裝載機制要義 2009-10-10 13:45 joeytang
    你好,請問在某個類調用類字面常量class時,這個類有沒有被裝載。如:自己定義一個類叫MyObj,當我調用MyObj.class的時候,MyObj有沒有被裝載?如果裝載了,什么時候裝載的,怎樣裝載的?如果沒有裝載,那么為什么可以獲得類對象里面的信息?
    希望得到解答,謝謝謝謝。  回復  更多評論
      

    # re: Java類裝載機制要義 2009-10-13 15:25 RogerTu
    @joeytang
    你的類(設為MyObjCaller)能調用MyObj.class,說明MyObjCaller類必然import了MyObj類。ClassLoader在加載MyObjCaller之前,必須先保證MyObj類先被加載。  回復  更多評論
      


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


    網(wǎng)站導航:
     
    主站蜘蛛池模板: 亚洲成色在线影院| 亚洲人成网站看在线播放| 少妇太爽了在线观看免费视频 | 又粗又硬又黄又爽的免费视频| 一本大道一卡二大卡三卡免费| 亚洲精品私拍国产福利在线| 国产精品成人免费一区二区| 二区久久国产乱子伦免费精品| 91亚洲性爱在线视频| 亚洲国产一级在线观看| 91成人在线免费视频| 男男黄GAY片免费网站WWW | 色视频在线观看免费| 亚洲成年人电影网站| 亚洲午夜激情视频| 国产福利在线免费| a级黄色毛片免费播放视频| 亚洲午夜无码久久| 久久伊人久久亚洲综合| 国产裸模视频免费区无码| 99国产精品免费视频观看| 色屁屁在线观看视频免费| 亚洲人成在线免费观看| 国产亚洲欧洲精品| 亚洲AV无码乱码精品国产| 99在线精品免费视频九九视| 手机看片国产免费永久| 免费国产黄网站在线看| 亚洲中文字幕无码爆乳| 久久亚洲私人国产精品| 中文字幕第13亚洲另类| 国产免费AV片无码永久免费| 7723日本高清完整版免费| 国产精品99久久免费观看| 免费人成网上在线观看| 亚洲精品av无码喷奶水糖心| 亚洲人成电影网站| 亚洲精品视频观看| 久久精品国产亚洲香蕉| 国产亚洲av片在线观看18女人 | 亚洲美女大bbbbbbbbb|