Наш проект выполняет инструментарий Java для байт-кода. И мы наткнулись на какое-то странное поведение. Предположим, следующий фрагмент кода:
public void a() {
new Integer(2);
}
Javac от Oracle компилирует вышеперечисленное в следующий байт-код:
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 выдает «dup» после «new», а Eclipse - нет. Что совершенно правильно в этом случае использования, поскольку вновь созданный экземпляр Integer вообще не используется, поэтому «dup» не требуется.
Мои вопросы:
- Есть ли какой-то обзор различий между разными компиляторами? Статья / сообщение в блоге?
- Можно ли с уверенностью заключить, что если между "new" и "invokespecial" нет "dup", то объект не используется после инициализации?