7

私はバイトコード計測プロジェクトに取り組んでいます。現在、オブジェクトを処理するとき、ベリファイアはほとんどの場合エラーをスローします。したがって、オブジェクトを使用したルールに関することを明確にしたいと思います(JVMを読みましたが、探していた答えが見つかりませんでした)。

私は新しい命令を計測しています:

元のバイトコード

NEW <MyClass>
DUP
INVOKESPECIAL <MyClass.<init>>

計装後

NEW <MyClass>
DUP
INVOKESTATIC <Profiler.handleNEW>
DUP
INVOKESPECIAL <MyClass.<init>>

プロファイル参照(新しく作成されたオブジェクト)を引数として取るProfiler.handleNEW()への呼び出しを追加したことに注意してください。

上記のコードの一部は、VerificationErrorをスローします。INVOKESTATIC(DUPのみを残す)を追加しない場合は追加されません。それで、私が違反している規則は何ですか?初期化されていない参照を複製することはできますが、パラメーターとして渡すことはできませんか?助けていただければ幸いです。ありがとうございました

4

2 に答える 2

4

JVMベリファイアは、コンストラクタがまだ呼び出されていないオブジェクトを、「初期化されていない」と呼ばれる特別なコンパイル時型を持っているかのように扱います。

したがって、ベリファイアの観点から何が起こっているかというとProfiler.handleNEW()、「初期化されていない」は(いわば)オブジェクトのサブクラスとは見なされないため、最初のパラメータとして間違ったタイプのオブジェクトを渡しています。

「初期化されていない」の定義方法に関するJVM仕様の関連部分は、ここにあります。

于 2010-05-07T19:41:42.773 に答える
1

コンストラクターが呼び出されるまでjava.lang.Object(技術的には通常は終了します)、参照のタイプは「初期化されていません」です。そのため、コンストラクターを呼び出す前に、参照を操作することはできません。これは、問題のオブジェクトのコンストラクターにも当てはまります。

于 2010-05-07T19:28:09.727 に答える