我们的项目做了一些 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”,那么初始化后不使用对象吗?