<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 閱讀(1738) 評論(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性无码区免费| 亚洲一区视频在线播放 | a级片在线免费看| 国产av无码专区亚洲国产精品| 精品亚洲视频在线| 四虎影院永久免费观看| 自拍偷自拍亚洲精品偷一| 午夜国产大片免费观看| 美女黄色毛片免费看| 亚洲精品国产日韩无码AV永久免费网 | 狠狠色香婷婷久久亚洲精品| 18女人毛片水真多免费| 亚洲美女人黄网成人女| 日本妇人成熟免费中文字幕| 亚洲欧洲AV无码专区| 国产色爽免费视频| 日本视频免费观看| 亚洲中久无码永久在线观看同| 中文字幕成人免费高清在线视频 | 亚洲综合熟女久久久30p| 中国毛片免费观看| 亚洲视频在线观看地址| 成人免费福利视频| 亚洲国产成人久久综合| 67194在线午夜亚洲| 四虎影视免费在线| jizz免费观看| 亚洲欧洲综合在线| 日韩免费视频在线观看| 亚洲精品国产日韩无码AV永久免费网| 亚洲精品国产福利一二区| 久久这里只精品国产免费10| 国产成人精品日本亚洲网址| 国产乱子伦精品免费无码专区| free哆拍拍免费永久视频| 亚洲视频小说图片| 免费少妇a级毛片人成网| 女人体1963午夜免费视频| 亚洲午夜精品久久久久久app| 亚洲一区无码精品色|