私は ASM を使用しており、次のように書き直したいと考えています。
someMethod().targetMethod(args...)
に:
someMethod().injectedMethod(arg).targetMethod(args...)
問題は、以前のメソッドが何であるかがわからず、ターゲット メソッドしか知らないことです (そのため、後で見つけsomeMethod()
て注入することはできません)。
また、ターゲット メソッドの多くのバージョンがあり、これを操作するさまざまなパラメーターのセットがあります。
ASM を使用すると、目的のメソッド呼び出しを簡単に見つけることができますが、残念ながらその時点でのオペランド スタックは次のようになります。
[ argN, ..., arg1, instance, ... ]
そして、インスタンスがどれくらい下にあるのかを理解することはできますが、それを読み取るために挿入できるバイトコードはありません。dup コマンドのトリックを使用して最大 4 つのパラメーターに対して実行できることはわかっていますが、一般的な解決策が必要です。
たくさんのローカル変数を追加してスタックからすべてをコピーし、指定されたインスタンスを複製してすべてを元に戻すことができますが、それは実行時の非効率性であり、私は本当に望んでいません。
どの命令がインスタンス ポインターをスタックに置くかを追跡でき、ターゲット メソッド呼び出しではなくそこにメソッド呼び出しを挿入できれば、うまくいくと思います。しかし、これを行うのに役立つものを見つけることができませんでした。
AspectJ のようなものがこれを可能にしていることは知っていますが、多くのクラスがロードされ、AspectJ が遅すぎるため、これを行う必要があります。
これを可能にするASM上に構築された分析ツールを教えてもらえますか、またはあるメソッド呼び出しを別のメソッド呼び出しの前に挿入するためのより良いアプローチを誰か考えてもらえますか?