我正在使用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生成的相同字节码。
答案 0 :(得分:0)
使用哪个字节码是否重要?老实说,可能不是。他们会以相对相似的速度做同样的事情。
现在,如果你想使用javac编译器而不是ECJ,你可以在运行时选项中设置它,你的代码将只用javac编译。 ECJ没有理由这样做,也没有任何办法,因为javac的商业版本(我相信)是闭源的。
如果重要的话,只需在运行时选项中切换到javac。