2011-11-25 12 views
7

クラスのインスタンスまたはメソッドの実行を、コードを変更せずに聴くことは可能ですか?以下のような 何か:別のクラスのメソッド実行をリッスンする方法はありますか?

someInstance.addMethodExecutionListener('methodName', handler); 
SomeClass.addMethodExecutionListener('methodName', handler); 

これは、ログ記録の目的のためになるには、...について、あなたは求めている何

+0

あなたは何をしたいですか? 'methodName()'関数が実行を開始するたびに通知を受ける必要がありますか? –

+0

正確に、そしてクラスコードを変更せずに。 –

答えて

5

あなたはアスペクト指向プログラミングで何ができるかの小さなサブセットです。普通のJavaとその実装ではサポートされていませんが、それはAspectJの主な理由です。

2

環境によっては、異なるテクノロジを使用できます。 Springは、特定のイベント(例えば、メソッド実行)にバインドできるAspectsを提供します。

Java EEコンテナ管理環境の場合は、EJBの場合はInterceptors、Webサービスの場合はSoapHandlersを使用できます。

0

1つのアプローチは、ツールAPI、JVMTI(別のデバッグAPIとプロファイリングAPIを置き換える)を使用することです。

それ以外の場合は、メソッドコードの前にコードを挿入するようにクラスファイルを書き直すことができます。それは必ずしも簡単ではありません。 ASMは、低レベルでのバイトコード操作には適していますが、ライブラリを使用したり、独自のツールを使用したり、場合によっては「アスペクト」ツールを使用することもできます。

バイトコードはロード前に、または実行時にinstrumentation API-javaagent:をコマンドラインで簡単に書き換えることができます。

関連する問題