乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Java類(lèi)裝載機(jī)制要義...

       ShangShujie 2007-04-25

      基本原理

      所有類(lèi)都由類(lèi)裝載器載入,載入內(nèi)存中的類(lèi)對(duì)應(yīng)一個(gè) java.lang.Class 實(shí)例。

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

      存在一個(gè) Bootstrap Loader (以下簡(jiǎn)稱(chēng)為 BL ),由 C++ 寫(xiě)成,負(fù)責(zé)在虛擬機(jī)啟動(dòng)后一次

      性加載 Java 基礎(chǔ)類(lèi)庫(kù)中的所有類(lèi)。其他的類(lèi)裝載器由 Java 寫(xiě)成,都是 java.lang.ClassLoader 的子類(lèi)。

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

       

           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;

          }

             對(duì)于給定的類(lèi)名,首先檢查自己是否已加載過(guò)該類(lèi)。如果沒(méi)有,則首先通過(guò)父裝載器加載(如果 parent==null ,則直接通過(guò) BL 來(lái)加載,相當(dāng)于 BL 是其父裝載器)。如果父裝載器也無(wú)法裝載,才真正調(diào)用自己的 findClass() 方法來(lái)裝載。

             Java 基礎(chǔ)類(lèi)在 Java 虛擬機(jī)啟動(dòng)后由 BL 一次性載入。構(gòu)成 Java 應(yīng)用程序的其它類(lèi)在程序運(yùn)行過(guò)程中由不同類(lèi)裝載器按需通過(guò) loadClass() 方法裝載。

      Java 程序啟動(dòng)過(guò)程中的類(lèi)裝載器

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

      虛擬機(jī)一啟動(dòng),先做一些初始化動(dòng)作,如獲取系統(tǒng)參數(shù)等,然后產(chǎn)生 BL BL 加載 Java 基礎(chǔ)類(lèi),這些類(lèi)都存放在 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 之內(nèi)的內(nèi)部類(lèi),繼承自 java.lang.URLClassLoader )的實(shí)例(以下簡(jiǎn)稱(chēng) EL )和 sun.misc.Launcher$AppClassLoader AppClassLoader 是定義于 sun.misc.Launcher 之內(nèi)的內(nèi)部類(lèi),繼承自 URLClassLoader )的實(shí)例(以下簡(jiǎn)稱(chēng) AL ),并將 EL parent 屬性設(shè)置為 null , AL parent 屬性設(shè)置為 EL 。

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

       

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

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

      什么時(shí)候裝載類(lèi),由什么類(lèi)裝載器裝載

      1.  Java 基礎(chǔ)類(lèi)由 BL 在虛擬機(jī)啟動(dòng)時(shí)一次性載入。

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

      3.  new 關(guān)鍵字創(chuàng)建一個(gè)類(lèi)的實(shí)例。該類(lèi)由運(yùn)行時(shí)刻包含該 new 語(yǔ)句的類(lèi)實(shí)例的類(lèi)裝載器( ClassLoader.getCallerClassLoader() )的 loadClass() 方法載入。

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

       

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

                       ClassLoader loader) throws ClassNotFoundException

             對(duì)于 public static Class<?> forName(String className) 版本,是由運(yùn)行時(shí)刻包含該語(yǔ)句的類(lèi)實(shí)例的類(lèi)裝載器( ClassLoader.getCallerClassLoader() )的 loadClass() 方法載入。

      5.  調(diào)用某個(gè) ClassLoader 實(shí)例的 loadClass() 方法。通過(guò)該 ClassLoader 實(shí)例的 loadClass() 方法載入。應(yīng)用程序可以通過(guò)繼承 ClassLoader 實(shí)現(xiàn)自己的類(lèi)裝載器。

      6 .裝載一個(gè)類(lèi)時(shí),首先要裝載該類(lèi)的基類(lèi)及其接口。

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀(guān)點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶(hù) 評(píng)論公約

        類(lèi)似文章 更多