Кто будет заниматься автоматическим боксом/распаковкой?
Это компилятор или среда выполнения делает автоматическую упаковку / распаковку?
Рассмотрим следующий пример:
public Integer get() {
return 1; //(1)
}
В (1) примитивное целочисленное значение преобразуется во что-то вроде new Integer(1)
и возвращается. Это фактически своего рода импликт-консверион , известный как авто-бокс, но кто это сделает? Компилятор или JVM?
Я только начал изучать ASM, и такая проблема бокса действительно смущает меня.
2 ответа:
Вы можете увидеть дизассемблированный код, используя
javap -c
команда:public class Example { public Example(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object."<init>":()V 4: return public java.lang.Integer get(); Code: 0: iconst_1 1: invokestatic #2 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer; 4: areturn }
Вы можете видеть, что
Integer#valueOf
был вызван, поэтому фактический код переводится в:public Integer get(){ return Integer.valueOf(1); }
Вывод:
Компилятор делает это за вас.