-2

アスペクトJとinvokedynamicを使った作業では、ポイントカットが呼び出されたメソッドと一致するときに、メソッドにアドバイスを織り込む必要があります。最初に、スクリプト内の invokedynamic-instruction のブートストラップ メソッドを独自のものと交換しました。ここで、ブートストラップ メソッドで、呼び出されたメソッドを最初に呼び出す CallSite を返し、その後、定義したアドバイスを返したいと考えています。

問題は、元のブートストラップ メソッドで使用されたものと同じ型シグネチャを持つ 1 つの MethodHandle から CallSite ビルドを返さなければならないことです。2 つのメソッドハンドル (元の + アドバイス) を新しいものに結合し、それを返される CallSite に使用することを考えました。しかし、それを行うための適切な方法が見つかりません。MethodHandles.foldArguments は有望なようですが、私にはうまくいきませんでした。もう 1 つのアイデアは、元のメソッド ハンドルとアドバイスを呼び出すラッパー メソッドから MethodHandle を構築することでしたが、問題は正しい型シグネチャです。

誰か私にアイデアや提案はありますか? アドバイスを使用して MethodHandle にパッチを適用するにはどうすればよいですか?

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

4

2 に答える 2

1

MethodHandles.guradwithtest で試してみましたが、動作します。しかし、これはあまり便利ではなく、元のメソッド ハンドルの前に何かを呼び出すことでしか機能しませんでした。

しかし、今では別の方法で解決しました。メソッドハンドルを取得し、必要な方法で呼び出すラッパーメソッドを作成しました。次に、そのラッパーメソッドを MethodHandle として取得し、引数を挿入します。次に、wrappermethod.asCollector(...) と wrappermethod.asType(...) です。短い説明で申し訳ありません。詳細を尋ねることができます。

于 2013-01-22T19:05:24.403 に答える
1

後処理の最も簡単な方法は、MethodHandles#filterReturnValue を使用することです。これにより、ターゲット メソッドを実行してから、戻り値をフィルター処理できます。入ってきたものを返すだけでなく、アドバイスに対して必要なことを何でも行うことができます。もちろん、型を合わせるために型変換を行う必要がありますが、それは大きな問題にはなりません。前処理の場合、おそらく前に追加してから削除した引数をフィルター処理します。

于 2013-01-16T13:52:24.000 に答える