呆呆向前沖的blog

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            78 隨筆 :: 43 文章 :: 5 評論 :: 74 Trackbacks

          隱式方法:new
          顯式方法:
          1。java.lang.Class的forName方法
          2。java.lang.ClassLoader里的loadClass方法


          ◆ 無法自行產(chǎn)生Class的實體,因為構造函數(shù)聲明為private。
          ◇ 只能通過Object的getClass方法,或者Class.forName("類名")獲得。
          ◆ Class類的實體在第一次載入內存時就建立了。以后在程序中產(chǎn)生Class代表的類的實體,其內部都會有個字段記錄著這個Class類所在的位置。
          ◇  可以把每個Class類的實體當作是某個類(*.class)在內存中的代理。
          ◆ 在Java中,每個類都是由某個類加載器(ClassLoader)來載入的,因此在Class類的實體中,由字段記錄載入它的ClassLoader的實體。如果該字段是null,不代表它不是由類裝載器所載入,而是代表這個類由引導式裝載器(bootstrap loader)載入。但是這個裝載器不是java編寫的,所以沒有實體。
          classloader.jpg
                                                                                              圖1
          注意:系統(tǒng)里同時存在多個ClassLoader實體。而且一個類裝載器可以載入多個類

          ★ 使用已有類裝載器

          1        Office off = new Office();
          2        ClassLoader loader = off.getClass().getClassLoader();
          3        Class c = loader.loadClass(args[0]);
          4        Object o = c.newInstance();

          注意:loadClass方法加載類時不會自動調用靜態(tài)初始化塊(static塊),必須等到第一次實體化該類時,才會調用。這與forName時傳入第二個參數(shù)為false的效果相同。

          下面是上述代碼的另一種寫法:

          1        Class cb = Office.class;
          2        ClassLoader loader = cb.getClassLoader();
          3        Class c = loader.loadClass(args[0]);        
          4        Object o = c.newInstance();

          ★ 自己建立類裝載器來載入類

          URLClassLoader

          ★ 類裝載器的階層體系

          Java程序運行流程:

          shur輸入java ***.class,java.exe根據(jù)自己的搜索邏輯找到JRE,接著找到位于JRE中的jvm.dll(真正的java虛擬機)。最后載入這個動態(tài)鏈接庫,激活java虛擬機。
                虛擬機一旦激活,會先做一些初始化操作,如獲取系統(tǒng)參數(shù)。
               初始化完成后,產(chǎn)生第一個類裝載器 Bootstrap Loader。然后做一些基本的初始化,然后它載入sun.misc命名空間底下的Launcher.java之中的ExtClassLoader,并設置其parent為null。然后Bootstrap Loader會繼續(xù)載入sun.misc命名空間下的Launcher.java之中的AppClassLoader,并設置其parent為剛載入的ExtClassLoader實體
                最后由AppClassLoader負責載入***.class。
                注意:上述三個類裝載器搜索類的路徑都是載入時讀取的,分別是“sun.boot.class.path”、“java.ext.dirs”、“java.class.path”,而且在虛擬機中只保留一份。在系統(tǒng)運行過程中不可能動態(tài)改變,除非使用新的類裝載器。

          ★ 委托模型

                類裝載器有載入類的需求時,會先請示其Parent使用其搜索路徑幫忙載入。如果Parent找不到,才由自己依照自己的搜索路徑搜索類。







           

          posted on 2005-07-19 00:57 呆呆向前沖的blog 閱讀(350) 評論(0)  編輯  收藏 所屬分類: 工作:Java技術
          主站蜘蛛池模板: 平湖市| 阿坝| 红安县| 布拖县| 仁化县| 西城区| 邵阳县| 盐山县| 铜梁县| 班玛县| 安新县| 怀宁县| 丹江口市| 剑川县| 达孜县| 于都县| 安阳县| 大冶市| 西平县| 宁化县| 弋阳县| 普兰店市| 藁城市| 文山县| 嘉祥县| 泸溪县| 鄂托克旗| 丰台区| 乐业县| 开原市| 梓潼县| 迁西县| 兴义市| 新民市| 马尔康县| 隆尧县| 绥中县| 清远市| 永川市| 龙岩市| 济宁市|