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

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

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

    關(guān)于eclipse和javac編譯結(jié)果不一致的問題的分析與解決 (轉(zhuǎn))

    問題:

    下面一個簡單的類:

    public class MyTest {
     private static String className = String.class.getName(); //紅色部分是下面問題的關(guān)鍵
     public static void main(String[] args){
      System.out.println(className);   
     }
    }

    經(jīng)eclipse3.1.1編譯后(指定類兼容性版本為1.4),再反編譯的結(jié)果是:

    public class MyTest
    {

        public MyTest()
        {
        }

        public static void main(String args[])
        {
            System.out.println(className);
        }

        private static String className;

        static
        {
            className = java.lang.String.class.getName();
        }
    }

    而經(jīng)過sun javac(或者ant, antx)編譯后(JDK版本1.4,或者JDK1.5,但是編譯結(jié)果指定版本為1.4),再反編譯的結(jié)果是:

    public class MyTest
    {

        public MyTest()
        {
        }

        public static void main(String args[])
        {
            System.out.println(className);
        }

        static Class _mthclass$(String x0)
        {
            return Class.forName(x0);
            ClassNotFoundException x1;
            x1;
            throw (new NoClassDefFoundError()).initCause(x1);
        }

        private static String className;

        static
        {
            className = (java.lang.String.class).getName();
        }
    }

     

    也就是說sun javac編譯出來的結(jié)果里面多了一個_mthclass$方法,這個通常不會有什么問題,不過在使用hot swap技術(shù)(例如Antx eclipse plugin中的快速部署插件利用hot swap來實現(xiàn)類的熱替換,或者某些類序列化的地方,這個就成為問題了。

     

    用_mthclass$在google上搜一把,結(jié)果不多,比較有價值的是這一篇:http://coding.derkeiler.com/Archive/Java/comp.lang.java.softwaretools/2004-01/0138.html

    按照這個說法,這個問題是由于Sun本身沒有遵循規(guī)范,而eclipse compiler遵循規(guī)范導致的,而且eclipse compiler是沒有辦法替換的。

     

    嘗試將JDK版本換成1.5,sun javac生成出來的_mthclass$是不見了,不過,這回奇怪的是eclipse的編譯結(jié)果中多了一個成員變量class$0,
    下面是經(jīng)eclipse3.1.1編譯后(指定類兼容性版本為5.0),再反編譯的結(jié)果:
    public class MyTest
    {

        public MyTest()
        {
        }

        public static void main(String args[])
        {
            System.out.println(className);
        }

        private static String className = java/lang/String.getName();
        static Class class$0;

    }
    而經(jīng)過sun javac(或者ant, antx)編譯后(JDK版本1.5),再反編譯的結(jié)果是:
    public class MyTest
    {

        public MyTest()
        {
        }

        public static void main(String args[])
        {
            System.out.println(className);
        }

        private static String className = java/lang/String.getName();

    }

    再在goole上搜了一把,發(fā)現(xiàn)了Eclipse3.2有兩個比較重要的特征:
    1.與javac的兼容性更好。
    2.提供了單獨的編譯器,可以在eclipse外部使用,包括ant中使用。

    于是下載eclipse3.2版本,首先驗證一下其與sun javac的兼容性如何,
    使用JDK1.4版本的時候,還是老樣子,sun javac編譯出來的_mthclass$方法在eclipse3.2的編譯結(jié)果中還是不存在,所以還是不兼容的。
    不過使用JDK1.5版本的時候,這會eclipse 3.2的編譯結(jié)果總算和sun javac一致了。

    雖然,用JDK1.5加上eclipse 3.2已經(jīng)保證了這個類在兩種編譯器下的兼容性,不過總覺得不踏實:
    1.誰知道這兩個編譯器還有沒有其它不兼容的地方呢?
    2.版本要求太嚴格,很多由于各種原因沒有使用這些版本的很麻煩。

    因此,還是從根本上解決這個問題比較合適:根本上解決最好就是不要使用兩種不同的編譯器,而使用同一種。
    由于eclipse環(huán)境下的編譯器是不可替換的,所以企圖都使用sun javac的方式不太可行,那么統(tǒng)一使用eclipse自帶的編譯器如何呢?
    剛才提到的eclipse3.2的第二個比較重要的特性就派上用場了。
    獨立的eclipse編譯器(1M大小而已)可以在如下地址下載:http://www.eclipse.org/downloads/download.php?file=/eclipse/downloads/drops/R-3.2-200606291905/ecj.jar
    這個獨立的編譯器在antx下的使用也很簡單:(關(guān)于該編譯器的獨立使用或者ant下面的使用可以參看this help section: JDT Plug-in Developer Guide>Programmer's Guide>JDT Core>Compiling Java code)
    1.將下載下來的編譯器放在ANTX_HOME/lib目錄下面。
    2.在總控項目文件的project.xml增加這么一行即可:<property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter"/>
    這樣就保證了通過antx打包的類也是用eclipse的編譯器編譯出來的,當然就不應該存在類不兼容的情況了。

     

    實際上,eclipse3.1.1版本也已經(jīng)提供了獨立的eclipse編譯器,不過當時并沒有單獨提供獨立的包下載,如果希望使用3.1.1版本的eclipse編譯器,可以使用org.eclipse.jdt.core_3.1.1.jar以及其中包含的jdtCompilerAdapter.jar。(eclipse3.1.1環(huán)境的編譯器我沒有獨立驗證過)

     


    posted on 2009-05-23 02:15 胡鵬 閱讀(4784) 評論(0)  編輯  收藏 所屬分類: java基礎

    導航

    <2009年5月>
    262728293012
    3456789
    10111213141516
    17181920212223
    24252627282930
    31123456

    統(tǒng)計

    常用鏈接

    留言簿(3)

    隨筆分類

    隨筆檔案

    agile

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 免费黄色网址入口| 亚洲精品国产福利在线观看| 亚洲永久网址在线观看| 人妻无码久久一区二区三区免费| 99视频全部免费精品全部四虎| 亚洲第一精品福利| 免费A级毛片无码专区| 亚洲精品永久www忘忧草| 57pao国产成视频免费播放| 亚洲日韩国产精品无码av| 四虎影视久久久免费| 在线观看特色大片免费视频 | 97无码免费人妻超级碰碰夜夜 | 9420免费高清在线视频| 亚洲精品第一国产综合精品| 91高清免费国产自产拍2021| 亚洲免费观看网站| 蜜臀91精品国产免费观看| 四虎成人精品国产永久免费无码 | 亚洲&#228;v永久无码精品天堂久久| 亚洲JLZZJLZZ少妇| 伊人婷婷综合缴情亚洲五月| 久久精品电影免费动漫| 亚洲人成网站日本片| 国产一级做a爱免费视频| 亚洲嫩草影院在线观看| 大香人蕉免费视频75| 一出一进一爽一粗一大视频免费的| 免费看的黄色大片| 一级特黄色毛片免费看| 亚洲高清在线观看| 女人18毛片水真多免费看| 日韩久久无码免费毛片软件| 亚洲国产精品国自产拍AV| 野花高清在线观看免费3中文| 手机永久免费的AV在线电影网| 亚洲精品无码久久久久久久 | 成人免费黄色网址| 国产vA免费精品高清在线观看 | 337P日本欧洲亚洲大胆艺术图| 亚洲中文字幕无码久久综合网|