我们的项目进行了一些Java字节码操作。然后我们发现了一些奇怪的行为。假设下面是代码片段:
public void a() {
new Integer(2);
}
Oracle的javac编译以上代码为以下字节码:
0: new #2; //class java/lang/Integer
3: dup
4: iconst_2
5: invokespecial #3; //Method java/lang/Integer."<init>":(I)V
8: pop
9: return
并将Eclipse的编译器转换为:
0: new #15; //class java/lang/Integer
3: iconst_2
4: invokespecial #17; //Method java/lang/Integer."<init>":(I)V
7: return
你可以看到,Oracle编译器在"new"之后生成了"dup",而Eclipse没有。在这种情况下完全正确,因为新创建的Integer实例根本没有被使用,所以不需要"dup"。
我的问题是:
- 有没有一些关于不同编译器之间差异的概述?一篇文章或博客帖子?
- 如果在"new"和"invokespecial"之间没有"dup",我能否安全地得出结论,对象在初始化后未被使用?
Note: I have translated the text as requested while retaining the HTML tags and without adding any explanations.
javac
的未来版本中会产生不同于现在的字节码 - 因此撰写过于依赖编译器生成的确切字节码的程序并不是一个好主意。 - Jesper