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

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


          網站導航:
           
          主站蜘蛛池模板: 文昌市| 宜宾县| 清涧县| 读书| 西和县| 平和县| 安陆市| 武胜县| 莎车县| 南京市| 高安市| 德惠市| 奉化市| 萝北县| 新巴尔虎右旗| 临西县| 玛沁县| 清水县| 海口市| 揭阳市| 滁州市| 旅游| 荣昌县| 孟津县| 凌海市| 广水市| 河东区| 巨野县| 尚义县| 南靖县| 南部县| 静海县| 洮南市| 南岸区| 昭通市| 外汇| 高邑县| 嘉义县| 绥滨县| 寿阳县| 盱眙县|