Понимание байт-кода, сгенерированного для простого 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

Другие вопросы по тегам