0

Java クラス A の .class ファイルが与えられた場合、(たとえば BCEL、ASM などを使用して) 特定のバイトコード シーケンスを抽出し (それが基本ブロックであると仮定)、別の場所に配置し、後で実行する方法はありますか?バイトコードのそのシーケンス?

例: ソース コードには ... a += b; という行があります。b += 21; . .

私はバイトコード表現にしかアクセスできません。これらのバイトコードを抽出して、ブラック ボックスとして扱いたいと考えています。クラス A の指示では、ソース行の代わりに「a += b;」欠落している適切なバイトコード シーケンスを保持するこの外部ブラック ボックス X をポイントする必要があります。スタック フレーム上のすべての必要な変数 (たとえば、a、b の現在の値、おそらくブラック ボックス X で使用されるメソッド パラメーターなど) をブラック ボックスにフィードし、バイトコード シーケンスの実行後に、ブラック ボックスは、新しく更新されたフレーム変数とともに元のクラス A に制御を戻します...

アイデアをありがとう。

編集:

以下に示すように、ブラック ボックスはスタブ クラス ファイル内のスタブ メソッドであることが最も合理的です。問題は、この命令シーケンスからこの整形式のスタブ クラスとメソッドを最も合理的に作成する方法と、元のクラス A から制御を移す方法です。理想的には、これはコンパイル時に「オフライン」で行われます。時間。

4

2 に答える 2

2

JavaのJVM仕様に準拠した実装でバイトコードを実行する唯一の方法は、バイトコードを(整形式の)クラスファイルに入れて、そのファイルをロードすることです。(つまり、バイトコードを配置できるのはクラスファイルの「メソッド」だけなので、バイトコードはクラスファイルの「メソッド」でラップする必要があります。)

さらに、バイトコードは、バイトコードベリファイアによって適用されるすべての安全規則に従わなければなりません。これにより、任意のシーケンスを実行する能力が制限されます。

バイトコードシーケンスの機能を理解しようとしているだけの場合は、手動で実行するか、ある種のバイトコードエミュレータを使用することをお勧めします。

于 2012-04-11T22:50:57.093 に答える
1

トリッキーな部分は、命令シーケンスを識別する方法です。シーケンスの最初と最後に行番号またはいくつかのマーカーメソッドを呼び出すことでそれを行うことが考えられます。

それを整理したら、ASM の分析パッケージを使用して、ローカル変数とスタック スロットの型を計算し、バイトコード シーケンスをコピーするメソッドのパラメーターとしてそれらを公開できます。

AOSD'07 からの私の記事は、ASM の良い出発点になるはずです。使用する必要があるものと非常によく似た変換を説明するメソッド本体とインライン メソッドのセクションを置き換えます。

于 2012-04-12T02:46:16.263 に答える