1

Java クラスのインスタンスに対して行われているメソッド呼び出しをスパイすることは可能ですか。を使用してこれを達成できることを知っていjava.lang.reflect.InvocationHandlerます。クラスのソースコードを変更する必要のない、もっと簡単な方法が他にあるのでしょうか?

編集:たとえばjava.util.HashMap。このクラスのソース コードは利用できません。少なくとも、Oracle の JDK で実行している場合は利用できません。put(...) メソッドへの呼び出しをどのようにインターセプトしますか。呼び出しのパラメーターを調べたいと思います。

4

5 に答える 5

4

これは、アスペクト指向プログラミングで行うことができます。あなたはただあなたが「スパイ」したいあなたのコードのポイントカットを宣言する必要があります。一言で言えば、アノテーションを宣言し、メソッドシグネチャの上に配置すると、すべてのアノテーション付きメソッドは、ソースコードを変更することなく、コンパイル時にコンパイラによって変更される(またはバイトコードをjvmにロードするときに変更される)可能性があります。

AspectJはこれに役立ちます。

于 2012-06-01T09:01:54.330 に答える
1

問題を言い換えると、特定のクラスへの非静的メソッド呼び出しが実行されるたびに、独自のコードを実行する必要があります。また、JVM環境へのフルアクセス権があることも前提としています。

JMXBeansを見てください。これらのBeanは、Java仮想マシンの動作へのインターフェースです。

また、MAINメソッドにアクセスできない既存のアプリケーションを変更するためのJavaエージェント仕様も参照してください。

于 2012-06-01T08:58:21.393 に答える
1

JMSPYを試すことができます。Jmspy は、Java メソッド呼び出しの記録、スナップショットと呼ばれるファイルへのデータの保存、および jmspy ビューアーを使用した分析を可能にする Java ライブラリです。

于 2014-12-24T15:58:39.287 に答える
0

AspectJをご覧ください。これにより、メソッドの呼び出しにフックを挿入し、メソッドの本体が実行される前後に任意のコードを実行できます。カスタムクラスローダーを使用してこれを解決します。

于 2012-06-01T08:56:55.533 に答える
0

横断的な関心事 (ロギングなど) の分離を可能にするアスペクト指向プログラミングを研究することをお勧めします。

このようにして、メソッドのポイントカットを指定すると、メソッドを「スパイ」することができます。

于 2012-06-01T09:00:01.880 に答える