Eclipse / javac不同的字节码

时间:2015-07-31 16:30:35

标签: java eclipse javac

我正在使用Eclipse和javac编译这个非常简单和天真的Java代码:

package anypackagename;

public class Foo {

    public static void bar(Class<?> cls) {
        while (cls != null) {
            final Class<?>[] interfaces = cls.getInterfaces();

            // ... 

            cls = cls.getSuperclass();
        }
    }
}

问题在于我使用不同的工具获得不同的字节码。

用Eclipse编译我得到了:

public static void bar(java.lang.Class<?>);
    Code:
       0: goto          13
       3: aload_0
       4: invokevirtual #18                 // Method java/lang/Class.getInterfaces:()[Ljava/lang/Class;
       7: astore_1
       8: aload_0
       9: invokevirtual #24                 // Method java/lang/Class.getSuperclass:()Ljava/lang/Class;
      12: astore_0
      13: aload_0
      14: ifnonnull     3
      17: return
    LineNumberTable:
      line 6: 0
      line 7: 3
      line 11: 8
      line 6: 13
      line 13: 17

然而,用javac编译我得到了:

 public static void bar(java.lang.Class<?>);
    Code:
       0: aload_0
       1: ifnull        17
       4: aload_0
       5: invokevirtual #2                  // Method java/lang/Class.getInterfaces:()[Ljava/lang/Class;
       8: astore_1
       9: aload_0
      10: invokevirtual #3                  // Method java/lang/Class.getSuperclass:()Ljava/lang/Class;
      13: astore_0
      14: goto          0
      17: return
    LineNumberTable:
      line 6: 0
      line 7: 4
      line 11: 9
      line 12: 14
      line 13: 17

显然“Eclipse已经实现了自己的编译器,称为Eclipse Compiler for Java(ECJ)。” (What is the difference between javac and the Eclipse compiler?)...我想知道的是,在Eclipse中是否有任何选项可以使用由javac生成的相同字节码。

1 个答案:

答案 0 :(得分:0)

使用哪个字节码是否重要?老实说,可能不是。他们会以相对相似的速度做同样的事情。

现在,如果你想使用javac编译器而不是ECJ,你可以在运行时选项中设置它,你的代码将只用javac编译。 ECJ没有理由这样做,也没有任何办法,因为javac的商业版本(我相信)是闭源的。

如果重要的话,只需在运行时选项中切换到javac。