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 閱讀(1740) 評論(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");

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


          網站導航:
           
          主站蜘蛛池模板: 浮山县| 工布江达县| 通江县| 大洼县| 襄汾县| 荥经县| 调兵山市| 余庆县| 恩施市| 洛扎县| 佛教| 黄浦区| 安岳县| 西乡县| 舟曲县| 通辽市| 武义县| 胶南市| 义乌市| 晋江市| 兰西县| 花莲县| 府谷县| 高州市| 沭阳县| 青铜峡市| 桃园市| 冷水江市| 太仓市| 陇西县| 京山县| 扎鲁特旗| 贵港市| 南乐县| 静海县| 连江县| 惠州市| 九龙坡区| 华亭县| 淮安市| 平舆县|