1

私はこのブログをフォローして、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
}
4

2 に答える 2

2

aload_0ローカルの非静的フィールドsimpleFを 5 に設定するステートメントで現在のクラスを参照するスタックにプッシュする必要があります。

[this.]simpleF=5

http://cs.au.dk/~mis/dOvs/jvmspec/ref-putfield.htmlから

<field-spec>putfield は、 in objectref (オブジェクトへの参照)によって識別されるフィールドの値を、オペランド スタックのシングル ワードまたはダブル ワードの値に設定します。

于 2016-03-23T00:54:11.810 に答える