« EclipseでGluonJ | Main | アノテーション版AspectJ »

2006.07.15

GluonJで全メソッドを処理対象に

 GluonJで全メソッドに対して適用する方法は実は簡単でした(^^;;
 クラス名やメソッド名のところに、普通にワイルドカードを指定することができるんですね。

@Around("{ " +
"long start = System.currentTimeMillis(); " +
"$_ = $proceed($$); " +
"System.out.println($class + `:` + (System.currentTimeMillis() - start) + `ms`); " +
"}")
Pointcut pc = Pcd.call("test.*#*(..)");

ってやると、コンストラクタも含めて全て処理対象となるようです。
 ちなみに、戻り値のあるメソッドを実行する場合は、その戻り値を$_で受け取らなければならず、逆に、voidメソッドに対して$_を指定しても無視されるだけなので、@Aroundで元のメソッドを呼び出す場合は$_ = $proceed($$);という感じで$_を指定しておくのが無難でしょう。

 基本的にJavassistのパラメータが参考になるようで、例えば$typeで呼び出されたメソッドの戻り値の型を、$classで呼び出されたクラスの名称を取得することができます。
 ただ、呼び出されたメソッドのメソッド名を取得する方法が見つからない・・・。

#おまけ

@Before("{ System.out.println(`putが呼び出されました:` + $1 + `/` + $2); }")
Pointcut map = Pcd.call("java.util.Map#put(..)").and.within("test.*");

とかやると、HashMap等に値を格納しようとしたときにログ出力を行うことができたりします。

|

« EclipseでGluonJ | Main | アノテーション版AspectJ »

Java」カテゴリの記事

Comments

Post a comment



(Not displayed with comment.)


Comments are moderated, and will not appear on this weblog until the author has approved them.



TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/3959/10952510

Listed below are links to weblogs that reference GluonJで全メソッドを処理対象に:

« EclipseでGluonJ | Main | アノテーション版AspectJ »