2

私は知っています(少なくともBCELまたはASMのいずれかを使用して)、何らかの方法でメソッドのローカル変数にアクセスすることは可能です...しかし、もっと何かが必要です。私が望むものは次のとおりです。

  1. そのような変数の型を取得する (または署名から変換する方法)
  2. この変数がいつ使用されるかを知る(区別する)(値が影響を受けるか、パラメーターとして渡されるかのいずれか)
  3. この変数がパラメーターとして使用される場合、どのメソッド呼び出しに渡されたかを知るために
  4. それぞれのメソッド呼び出しで「メソッドチェーン」を壊し、戻り値を取得して操作できるようにする

基本的な考え方は、デバッガーと同じようにメソッドを「インスツルメント」したいということです (ただし、最初のフレームの深さに制限されています...)。

どんなポインタでも感謝します。さらに情報が必要な場合は、お気軽にお問い合わせください。

4

1 に答える 1

0

これは、バイト コード レベルの API を使用する場合にのみ可能です。cglib はそのような API を公開していないため、ASM、BCEL、Javassist のいずれかを選択する必要があります。最適なドキュメントがあるASM をお勧めします。

あなたがする必要があること:

  1. メソッドの署名を解析します。ASM はそのためのユーティリティを提供します。内部名で任意のタイプを取得します。これらの名前をインデックスにマップする必要があります。
  2. そのインデックスから使用されている変数の使用を見つけます。

ただし、これはかなり難しい作業です。コードを予測するには、メソッド呼び出しをエミュレートする必要があります。JVM はスタック マシンであり、任意のコマンド チェーンの結果として引数をオペランド スタックに配置できます。したがって、見つけたバイトコード命令を効果的に解釈する必要があります。多かれ少なかれ、独自の単純なインタープリターを作成する必要がありますが、これはかなりの作業です。

于 2015-02-17T07:43:09.027 に答える