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

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

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

    精彩的人生

    好好工作,好好生活

    BlogJava 首頁 新隨筆 聯系 聚合 管理
      147 Posts :: 0 Stories :: 250 Comments :: 0 Trackbacks

    java中的類是動態加載的,我們先看一下我們常用的類加載方式,先有一個感性的認識,才能進一步
    深入討論,類加載無非就是下面三種方式。
    class A{}
    class B{}
    class C{}
    public class Loader{
    ??? public static void main(String[] args) throws Exception{
    ?????? Class aa=A.class;
    ?????? Class bb=Class.forName("B");
    ?????? Class cc=ClassLoader.getSystemClassLoader().loadClass("C");
    ??? }
    }
    我們先看.class字面量方式,很多人可能不知道這種方式,因為這種用法不是一般java語法。
    通過javap我們可以發現,這種方式的大致等價于定義了一個靜態成員變量
    ??? static Class class$0;(后面的編號是增長的)
    你可以試圖再定義一個? static Class class$0,應該會收到一個編譯錯誤(重復定義)。
    Class aa=A.class;
    就相當于
    ??? if(class$0==null){
    ?try{
    ?????????? Class.forName("A");
    ?}
    ?cacth(ClassNotFoundException e){
    ??? throw new NoClassDefFoundError(e);
    ?}
    ??? }
    ??? Class aa=class$0;
    可以很清楚的看到,這種類的字面量定義其實不是加載類的方式,而是被編譯器處理了,實質
    上是使用了Class.forName方法,但是使用這種方式有一個很大的好處就是不用處理異常,因為
    編譯器處理的時候如果找不到類會拋出一個NoClassDefFoundError。也許你覺得需要處理
    ClassNotFoundException這種異常,事實上99%的情況下我們可以把這種異常認為是一個錯誤。
    所以大部分情況我們使用這種方式會更簡潔。
    最常用的方式就是Class.forName方式了,這也是一個通用的上層調用。這個方法有兩個重載,
    可能很多人都忽略了第二個方法。
    public static Class forName(String name) throws ClassNotFoundException
    public static Class forName(String name, boolean initialize,ClassLoader loader) throws ClassNotFoundException
    第二個方法后面多了兩個參數,第二個參數表示是否初始化,第三個參數為指定的類加載器。
    在上面的例子中:
    Class bb=Class.forName("B");等價于
    Class bb=Class.forName("B",true,Loader.class.getClassLoader());
    這里要詳細說一下這個類的初始化這個參數,如果這個參數為false的話,
    類中的static成員不會被初始化,static語句塊也不會被執行。
    也就是類雖然被加載了,但是沒有被初始化,不過在第一次使用時仍然會初始化。
    所以我們有時候會看到Class.forName("XXX").newInstance()這樣的語句,為什么這里要創建一個
    不用的實例呢?不過是為了保證類被初始化(兼容以前的系統)。
    其實第二個方法是比較難用的,需要指定類加載器,如果不指定而且又沒有安裝安全管理器的化,
    是無法加載類的,只要看一下具體的實現就明白了。
    最本質的方式當然是直接使用ClassLoader加載了,所有的類最終都是通過ClassLoader加載的,
    Class cc=ClassLoader.getSystemClassLoader().loadClass("C");
    這里通過使用系統類加載器來加載某個類,很直接的方式,但是很遺憾的是通過這種方式加載類,
    類是沒有被初始化的(也就是初始化被延遲到真正使用的時候).不過我們也可以借鑒上面的經驗,加載
    后實例化一個對象Class cc=ClassLoader.getSystemClassLoader().loadClass("C").newInstance()。
    這里使用了系統類加載器,也是最常用的類加載器,從classpath中尋找要加載的類。
    java中默認有三種類加載器:引導類加載器,擴展類加載器,系統類加載器。
    java中的類加載有著規范的層次結構,如果我們要了解類加載的過程,需要明確知道哪個類被誰
    加載,某個類加載器加載了哪些類等等,就需要深入理解ClassLoader的本質。
    以上只是類加載的表面的東西,我們還將討論深層次的東西。

    原文:http://dev.csdn.net/author/treeroot/a481eb323af84caab1149221432e46b9.html

    posted on 2006-10-23 16:20 hopeshared 閱讀(905) 評論(0)  編輯  收藏 所屬分類: Java
    主站蜘蛛池模板: 亚洲人成网77777色在线播放| 成**人免费一级毛片| 一级做a免费视频观看网站| fc2免费人成在线视频| 久久精品电影免费动漫| 无码国产精品一区二区免费 | 在线观看国产区亚洲一区成人| 久久精品国产亚洲AV无码偷窥 | 亚洲人成无码网站在线观看| 日本激情猛烈在线看免费观看| 国内精品免费久久影院| 国内精品免费麻豆网站91麻豆| 亚洲国产精品狼友中文久久久| 久久精品国产亚洲77777| 2021国内精品久久久久精免费| 免费一级做a爰片久久毛片潮喷| 无码久久精品国产亚洲Av影片| 亚洲最大的成人网站| 中文字幕免费在线视频| 日韩免费毛片视频| 亚洲日本一区二区| 国产视频精品免费视频| 日本媚薬痉挛在线观看免费| 美女被免费视频网站a| 一个人免费高清在线观看| 亚洲欧洲日产国码无码久久99 | 在线aⅴ亚洲中文字幕| 国产无遮挡又黄又爽免费视频| 亚洲国产成人久久精品app| 国产乱子伦精品免费视频| 亚洲va久久久噜噜噜久久天堂| 免费人成动漫在线播放r18 | 久久国产成人亚洲精品影院| 亚洲综合校园春色| 免费看又黄又无码的网站| 在线亚洲精品自拍| 曰批视频免费40分钟试看天天| mm1313亚洲国产精品无码试看| 搡女人免费视频大全| 国产亚洲精aa在线看| 最近中文字幕mv手机免费高清|