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

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

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

    TWaver - 專注UI技術

    http://twaver.servasoft.com/
    posts - 171, comments - 191, trackbacks - 0, articles - 2
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    JDK1.5和JDK1.4編譯的不同效果

    Posted on 2010-08-29 09:13 TWaver 閱讀(1737) 評論(3)  編輯  收藏

    平時有時候需要初始化某些參數,經常就直接在一個類里面加一個static,然后把需要初始化的內容寫到里面,在外邊只需要引用一下這個類就可以了,程序一直運行沒有問題,但是最近把JDK升級到1.6發現static中的參數都沒有初始化,研究了下發現在1.5及以上版本,JDK修改了編譯邏輯,如果只引用下Language.class這種,是不會運行到static里面的代碼的,必須類的構造函數被調用才會運行。測試代碼如下

     1public class Main {
     2    public static Date date = null;
     3
     4    public static void main(String[] args) {
     5        System.out.println(Language.class);
     6        System.out.println("------------");
     7        System.out.println("date:" + date);
     8        System.out.println("------------");
     9        System.out.println(Language.JAVA);
    10    }

    11}

    12
    13public class Language {
    14
    15    public final static Language[] languages;
    16    public final static Language C = new Language("C");
    17    public final static Language JAVA = new Language("java");
    18    public final static Language FORTRAN = new Language("FORTRAN");
    19    static {
    20        System.out.println("in static block");
    21        languages = new Language[] { C, JAVA, FORTRAN };
    22        Main.date = new Date();
    23        System.out.println("leave static block");
    24    }

    25
    26    private String name;
    27
    28    private Language(String name) {
    29        this.name = name;
    30        System.out.println("create '" + name + "' language");
    31    }

    32
    33    public String toString() {
    34        return this.name;
    35    }

    36
    37}
    JDK1.4下執行結果
    create ‘C’ language
    create ‘java’ language
    create ‘FORTRAN’ language
    in static block
    leave static block
    class Language
    ————
    date:Mon Aug 02 16:21:42 CST 2010
    ————
    java
    JDK1.5下執行結果
    class Language
    ————
    date:null
    ————
    create ‘C’ language
    create ‘java’ language
    create ‘FORTRAN’ language
    in static block
    leave static block
    java

    評論

    # re: JDK1.5和JDK1.4編譯的不同效果  回復  更多評論   

    2010-08-29 11:22 by 豬夕笨笨
    編譯器優化的結果,因為這些代碼的內容都是可以在編譯期確定,所以就自動優化了。

    # re: JDK1.5和JDK1.4編譯的不同效果  回復  更多評論   

    2010-08-29 22:39 by xylz
    "必須類的構造函數被調用才會運行"?
    自認為的吧。。。

    # re: JDK1.5和JDK1.4編譯的不同效果  回復  更多評論   

    2010-08-30 10:57 by 隔葉黃鶯
    這不是編譯器的行為。

    這在于類在加載時是否被初始化的問題,也就是
    Class.forName(String name,boolean initialize,ClassLoader loader);
    類加載時上面函數的第二個參數,jdk 1.4 中 可能默認是 true, 而在jdk1.5 中默認為 false,應該可以統一改默認值為 true.

    你可以用這樣的代碼測試一下
    Class c = Class.forName("com.unmi.DynamicClass", false, ClassLoader.getSystemClassLoader());

    改變第二個參數值,true or false 看看執行效果。

    樓主幫忙測試一下面代碼行在不同jvm中是否有執行類的 static 部分代碼:
    ClassLoader.getSystemClassLoader().loadClass("com.unmi.DynamicClass");

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


    網站導航:
     
    主站蜘蛛池模板: 久久久久国产精品免费看| 久久精品亚洲日本波多野结衣| 青青草97国产精品免费观看| 久久精品无码一区二区三区免费| 亚洲国产成人久久综合一区| 亚洲免费中文字幕| 亚洲人成影院在线高清| 免费无码不卡视频在线观看| 国产成人+综合亚洲+天堂| 伊人久久亚洲综合影院| 国产免费人成视频尤勿视频| 久久久亚洲精品视频| 亚洲视频在线免费看| 亚洲色欲色欲www| 日韩免费一区二区三区| 一区二区在线视频免费观看| 永久亚洲成a人片777777| 好紧我太爽了视频免费国产| 亚洲黄色在线网站| 在线播放免费人成视频在线观看| 午夜亚洲国产理论片二级港台二级| 亚洲乱码中文字幕综合234| 三级黄色在线免费观看| 4480yy私人影院亚洲| 好爽…又高潮了免费毛片| 色爽黄1000部免费软件下载| 亚洲AV第一页国产精品| 四虎国产精品免费久久| 免费国产va视频永久在线观看| 亚洲乱码中文字幕久久孕妇黑人| 中文字幕天天躁日日躁狠狠躁免费| 亚洲综合成人婷婷五月网址| 亚洲va中文字幕无码| 99在线观看精品免费99| 亚洲精品9999久久久久无码 | 最近中文字幕免费mv视频8| 直接进入免费看黄的网站| 久久综合九九亚洲一区| 暖暖在线日本免费中文| 免费人成激情视频在线观看冫| 亚洲一区动漫卡通在线播放|