2012-04-11 14 views
0

JavaクラスAの.classファイルを指定すると、特定のバイトコードシーケンスを抽出するための方法(たとえばBCEL、ASMなど)それを別の場所に置き、その後、そのバイトコードのシーケンスを実行しますか?Javaバイトコードの任意のシーケンスを抽出して実行する

例: ソースコードには... a + = b; b + = 21; 。 。

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

ありがとうございました。

編集:

以下示唆したように、ブラックボックスは、最も合理的にスタブクラスファイルの内部スタブ方法になります。次に、この命令シーケンスからこの形式のスタブクラスとメソッドを最も合理的に作成する方法と、元のクラスAからコントロールを転送する方法です。理想的には、これはコンパイル時に「オフライン」に行われます。時間。

答えて

1

難しい部分は、命令シーケンスをどのように識別するかです。シーケンスの始めと終わりに、行番号またはマーカーメソッド呼び出しで行うことができます。

ASMの解析パッケージを使用して、ローカル変数とスタック・スロットのタイプを計算し、バイトコード・シーケンスをコピーするいくつかのメソッドのパラメータとしてそれらを公開することができます。

私のarticle from AOSD'07は、ASMの出発点になるはずです。 Replace Body BodyとInline Methodセクションは、使用する必要があるかもしれないものに非常に類似した変換を記述します。

+0

素晴らしい記事です。 ASMがそのような優れたツールである主な理由は、優れたドキュメントのためです。 – ChaimKut

2

JVM仕様に準拠したJavaの実装でバイトコードを実行する唯一の方法は、バイトコードを(整形式の)クラスファイルに入れてロードすることです。 (バイトコードはクラスファイル内の "メソッド"にラップする必要があることを意味します。バイトコードはこれが唯一の場所ですから)。

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

バイトコードのシーケンスが何であるか把握しようとしているのであれば、手で実行する方がよいし、何らかのバイトコードエミュレータを使用する方がよい。

関連する問題