私はまだJavaクラスファイル形式を学ぼうとしており、定数変数の値がConstantValue属性に格納されていることは理解していますが、非定数フィールド値がクラスファイルのどこに格納されているかわかりません。そのような
public Robot robot = new Robot();
オラクルのクラスファイルの仕様を調べたところ、このような属性は見つかりませんでした。
私はまだJavaクラスファイル形式を学ぼうとしており、定数変数の値がConstantValue属性に格納されていることは理解していますが、非定数フィールド値がクラスファイルのどこに格納されているかわかりません。そのような
public Robot robot = new Robot();
オラクルのクラスファイルの仕様を調べたところ、このような属性は見つかりませんでした。
貼り付けたコードには定数がありません。変数があるだけです(実行時にスタックに割り当てられます)。
非定数フィールドを持つクラスのバイトコードがどのように見えるかに興味がある場合は、この記事を試すことができます。
変数robot
は実行時に初期化されます。言っrobot
て、クラスにいFoo
ます:
class Foo {
public Robot robot = new Robot();
Foo() {
}
}
Java コンパイラはnew Foo()
、次の手順を実行する一連の命令に変換します。
Foo
ヒープ上の新しいオブジェクトにスペースを割り当てます。これには、フィールドのスペースが含まれます robot
。Foo
Robot
Foo
Robot
したがって、バイトコードの内容は
Foo
Robot
結論は、クラス ファイルのバイトコードにフィールド ロボット用のスペースがないということです。実行時に実行され、ヒープ上にフィールド用のスペースを作成する割り当て命令があります。