中文JAVA技術平等自由協作創造

          Java專題文章博客和開源

          常用鏈接

          統計

          最新評論

          Java類加載器classLoader的工作機制

            類加載器就是尋找類或接口字節碼文件進行解析并構造JVM內部對象表示的組件。在Java中,類轉載器把一個類裝入JVM中,需要經過以下步驟:
            1.裝載:查找和導入Class文件;
            2.鏈接: 執行校驗、準備和解析步驟,其中解析步驟是可以選擇的:
            a)校驗: 檢查載入Class文件數據的正確性;
            b)準備:給類的靜態變量分配存儲空間;
            c)解析:將符號引用變成直接引用sat答案
            3.初始化:對類的靜態變量、靜態代碼塊進行初始化工作。
            類裝載工作是由ClassLoader及其之類負責的,ClassLoader是一個重要的Java運行時系統組件,它負責在運行時查找和裝入Class字節文件。JVM在運行時會產生三個ClassLoader:跟裝載器、ExtClassLoader(擴展類裝載器)和AppClassLoader(系統類裝載器)。其中,跟裝載器不是ClassLoader的子類,它使用C++編寫,因此我們在Java中看不到它,跟裝載器負責裝載JRE的核心類庫,如rt.jar,charsets.jar等。ExtClassLoader和AppClassLoader都是ClassLoader的子類。其中ExtClassLoader負責裝載JRE擴展目錄ext中的JAR類包;AppClassLoader負責裝載ClassPath路徑下的類包托福答案
            這三個類裝載器之間存在父子層級關系,跟裝載器是ExtClassLoader的父裝載器,ExtClassLoader是AppClassLoader的父裝載器。默認情況下,使用AppClassLoader裝載應用程序的類,我們可以試驗如下:
            [java]
            package com.uestc.test;
            public class ClassLoaderTest {
            public static void main(String[] args) {
            ClassLoader c=Thread.currentThread()。getContextClassLoader();
            System.out.println(c);
            System.out.println(c.getParent());
            System.out.println(c.getParent()。getParent());
            }
            }
            運行結果如下:
            [java]
            sun.misc.Launcher$AppClassLoader@1016632
            sun.misc.Launcher$ExtClassLoader@dc6a77
            null
            從上述結果可以分析得出當前的ClassLoader是AppClassloader,父ClassLoader是ExtClassLoader,祖父ClassLoader是根類裝載器,因為在Java中無法獲得它的句柄,因此返回null.
            ClassLoader與Class.forName的區別
            classLoader中的函數loadclass用于Class文件的加載但并沒有完成初始化工作,而使用Class.forName則完成了初始化工作即完成對類的靜態變量、靜態代碼塊執行初始化工作。實例如下:
            需要加載的類Reflect.java如下:
            [java]
            package com.uestc.test;
            public class Reflect {
            private int userName;
            private int password;
            static {
            System.out.println("Reflect static block");
            }
            public Reflect(){
            System.out.println("Reflect constructs");
            }
            public int getUserName() {
            return userName;
            }
            public void setUserName(int userName) {
            this.userName = userName;
            }
            public int getPassword() {
            return password;
            }
            public void setPassword(int password) {
            this.password = password;
            }
            }

            測試類Test.java如下:
            [java]
            package com.uestc.test;
            public class Test {
            public static void main(String[] args) {
            ClassLoader classLoader=Thread.currentThread()。getContextClassLoader();
            try {
            System.out.println("使用ClassLoader中的loadClass加載:");
            classLoader.loadClass("com.uestc.test.Reflect");
            System.out.println("使用Class.forName()加載:");
            Class.forName("com.uestc.test.Reflect");
            } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            }
            }
            }
            運行結果如下:
            [java]
            使用ClassLoader中的loadClass加載:
            使用Class.forName()加載:
            Reflect static block
            從上述結果可以看出loadClass并沒有進行初始化工作,而Class.forName()進行了初始化工作。

          posted on 2013-12-01 20:26 好不容易 閱讀(197) 評論(0)  編輯  收藏


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


          網站導航:
           
          PK10開獎 PK10開獎
          主站蜘蛛池模板: 郧西县| 南召县| 元谋县| 新邵县| 五台县| 南木林县| 灵台县| 丰都县| 襄汾县| 纳雍县| 新营市| 新昌县| 文山县| 南丰县| 绥宁县| 彭州市| 凤山县| 清原| 吉安县| 寿光市| 辰溪县| 开封县| 枝江市| 治县。| 晴隆县| 嘉祥县| 建宁县| 苏尼特右旗| 巴彦县| 阳泉市| 托里县| 册亨县| 慈溪市| 承德县| 炉霍县| 锡林浩特市| 昌宁县| 玉田县| 龙门县| 甘孜县| 黔西|