0

私はまだJavaクラスファイル形式を学ぼうとしており、定数変数の値がConstantValue属性に格納されていることは理解していますが、非定数フィールド値がクラスファイルのどこに格納されているかわかりません。そのような

public Robot robot = new Robot();

オラクルのクラスファイルの仕様を調べたところ、このような属性は見つかりませんでした。

4

2 に答える 2

0

貼り付けたコードには定数がありません。変数があるだけです(実行時にスタックに割り当てられます)。

非定数フィールドを持つクラスのバイトコードがどのように見えるかに興味がある場合は、この記事を試すことができます。


変数robotは実行時に初期化されます。言っrobotて、クラスにいFooます:

class Foo {
    public Robot robot = new Robot();
    Foo() {
    }
}

Java コンパイラはnew Foo()、次の手順を実行する一連の命令に変換します。

  • Fooヒープ上の新しいオブジェクトにスペースを割り当てます。これには、フィールドのスペースが含まれます robot
  • クラスのイニシャライザ命令にジャンプFoo
    • Foo イニシャライザは、の新しいインスタンスにスペースを割り当てますRobot
    • の親のコンストラクターを呼び出しますFoo
    • の初期化子を呼び出すRobot
  • ...

したがって、バイトコードの内容は

  • の割り当てと初期化の指示Foo
  • の割り当てと初期化の指示Robot

結論は、クラス ファイルのバイトコードにフィールド ロボット用のスペースがないということです。実行時に実行され、ヒープ上にフィールド用のスペースを作成する割り当て命令があります。


于 2013-06-02T14:43:45.343 に答える