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)。"(javac和Eclipse编译器之间有什么区别?)…我想知道的是,在Eclipse中是否有任何选项可以使用javac生成的相同字节码。

使用哪个字节码有关系吗?老实说,可能不会。它们会以相对相似的速度做同样的事情。

现在,如果您确实想使用javac编译器而不是ECJ,您可以在运行时选项中设置它,然后您的代码将简单地用javac编译。ECJ没有理由能够做到这一点,也没有任何方法可以做到,因为javac的商业版本(我相信)是闭源的。

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

最新更新