2012-03-07 20 views
8

Javaで呼び出されるメソッドの後にメソッドを実行してから、methodA )が呼び出され、続いて別のメソッドが呼び出され、というメソッドAfterA()が呼び出されます。これは、Junitが(@Before、@Test、@Afterを使用して)アノテーションを使用しているのと非常によく似ているので、リフレクションを使用して可能でなければならないと思っていますが、とても良いヒントはありません。(前と私は<em>methodA()</em>を呼び出した後、第1の方法はmethodBeforeA()</em>が呼び出される<em>という名前のようなJavaプログラムを書くためにしようとしている

答えて

5

AspectJでは、メソッドエントリの前と終了後にカットポイントを指定できます。 AspectJので

http://www.eclipse.org/aspectj/doc/released/progguide/starting-aspectj.html

、ポイントカットは、プログラムフロー内の特定の参加点を選び出します。単一intパラメータを持つつまり、Pointvoid setX方法 - 例えば、各アウトポイントカット

call(void Point.setX(int)) 

ピック署名ボイドPoint.setX(int)を有するメソッドの呼び出しである点に参加します。

+0

正直な質問:AspectJのアドバイスは、Reflection経由でターゲットメソッドが呼び出されたときにも実行されますか? –

+0

@AlistairIsrael、http://www.eclipse.org/aspectj/doc/released/faq.php#q:reflectiveCallsは必ずしもそうとは限りません。 –

+0

私は正しい方向に向いてくれてありがとう。このblogpostを見て、私が探していたものを正確に提供する。http://www.mkyong.com/spring3/spring-aop-aspectj-annotation-example/ – Vanp

3

これは、他のメソッドへの呼び出しを挿入するためにメソッドコードを変更する必要があります。 Javaのリフレクションでは、多くのことができますが、メソッドコードを動的に変更することはできません。

JUnitとは何が違うのですか?それは、@Beforeを注釈付きの各メソッドを特定し@Test、および@After、その後の線に沿って何かを行います。あなたは確かにあなたが「前」と後にメソッド「後」を呼び出すことを確認するために、このような何かを行うことができ

for (Method t : testMethods) { 
    for (Method b : beforeMethods) 
     b.invoke(); 
    t.invoke(); 
    for (Method a : afterMethods) 
     a.invoke(); 
} 

を毎回を呼び出してください。しかし、すべての発信者に同じことを強制することはできません。

関連する問題

 関連する問題