<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");

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


    網站導航:
     
    主站蜘蛛池模板: 国产亚洲综合精品一区二区三区| 亚洲成人福利在线| 美女被免费网站在线视频免费| 成人毛片免费视频| 亚洲日日做天天做日日谢| 久久这里只有精品国产免费10| 亚洲理论精品午夜电影| 在线天堂免费观看.WWW | 久久久亚洲精品视频| 国内精品久久久久影院免费 | 亚洲日韩涩涩成人午夜私人影院| 国产成人亚洲精品无码AV大片| 国产又大又长又粗又硬的免费视频| 亚洲欧洲免费无码| 国产免费人视频在线观看免费| 污网站免费在线观看| 亚洲人成网站在线观看播放| 先锋影音资源片午夜在线观看视频免费播放 | 噼里啪啦免费观看高清动漫4| 亚洲最大的成人网| 免费成人午夜视频| 你懂的免费在线观看| 亚洲黄色在线网站| 真实乱视频国产免费观看| 免费一级毛suv好看的国产网站| 亚洲综合精品香蕉久久网| 亚洲网站在线免费观看| 国产精品亚洲综合久久| 亚洲精品国产精品国自产观看 | 亚洲Aⅴ在线无码播放毛片一线天 亚洲avav天堂av在线网毛片 | 亚洲色婷婷一区二区三区| 69精品免费视频| 亚洲AV成人片无码网站| 久久亚洲AV午夜福利精品一区| 午夜毛片不卡高清免费| 皇色在线免费视频| 久久久久久亚洲精品影院| 亚洲毛片αv无线播放一区 | 无人在线观看完整免费版视频| 美女露隐私全部免费直播| 亚洲天堂中文字幕|