Понимание байт-кода, сгенерированного для простого Java-класса
Я слежу за этим блогом, чтобы изучить Java к байт-коду, и я сгенерировал байт-код для этого SimpleClass.
public class SimpleClass {
public int simpleF = 5;
}
Я понимаю позиции байт-кода, как показано ниже
- 0 для этого
- 1 для вызова конструктора суперкласса Object.
- 4 -?
- 5 для значения 5
- 6 выскочить из стека и назначить 5 для переменной.
Но я не понимаю aload_0
в положении 4 и его цель?
// Compiled from SimpleClass.java (version 1.6 : 50.0, super bit)
public class SimpleClass {
// Field descriptor #6 I
public int simpleF;
// Method descriptor #8 ()V
// Stack: 2, Locals: 1
public SimpleClass();
0 aload_0 [this]
1 invokespecial java.lang.Object() [10]
4 aload_0 [this]
5 iconst_5
6 putfield SimpleClass.simpleF : int [12]
9 return
Line numbers:
[pc: 0, line: 2]
[pc: 4, line: 4]
[pc: 9, line: 2]
Local variable table:
[pc: 0, pc: 10] local: this index: 0 type: SimpleClass
}
2 ответа
aload_0
нужно вставить в стек ссылку на текущий класс в операторе, который устанавливает локальное нестатическое поле simpleF
до 5
[this.]simpleF=5
От http://cs.au.dk/~mis/dOvs/jvmspec/ref-putfield.html
putfield устанавливает значение поля, обозначенного
<field-spec>
в objectref (ссылка на объект) на значение одинарного или двойного слова в стеке операндов.
Для того, чтобы JVM выполнила почти все, что нужно, она помещает вещи в стек выполнения, aload_0 используется для загрузки объекта из массива локальных переменных (позиция 0) в стек выполнения, например, методы позиции 0 всегда ссылаются на это, что является ссылкой к текущему объекту.
Дополнительную информацию можно найти в этой статье: http://blog.jamesdbloom.com/JavaCodeToByteCode_PartOne.html