JoinPoint到達時のthis変数を限定・取得する場合に使います。
pointcut advice() : call(* *(..)) && this(SampleClass);
この場合、JoinPointはSampleClass内のコードから
メソッドを呼び出したときにJoinPointが設定されます。
ただし、staticメソッド内ではthis変数は存在しないので
この場合にはJoinPointは設定されません。
pointcut advice(SampleClass clazz) : call(* *(..)) && this(clazz);
JoinPointを設定する条件は前述のものと一緒ですが、
adviceにパラメータを一つ追加しています。
これは、メソッドを呼び出したときのthis変数(SampleClassのもの)になります。
メソッドを実行する前後にJoinPointを設定します。call
とよく似ているのですが、若干動作が異なります。
call
はメソッドを呼び出す箇所にJoinPointが設定されるのに対し、execution
はメソッドそのものにJoinPointが設定されます。
void func1() { func2(); // callのJoinPointはここ } void func2() { // executionのJoinPointはここ ... } pointcut advice1() : call(void func2()); pointcut advice2() : execution(void func2());
JoinPointが変わることによって、いくつかのキーワードも挙動が変わってきます。
void func1() { func2(); // callのJoinPointはここ } void func2() { ... } pointcut advice1() : call(void func2()) && withincode(* func1(..)); pointcut advice2() : execution(void func2()) && withincode(* func1(..)); // advice2に当てはまるJoinPointは存在しない
withincode
は、現在評価中のJoinPointが
特定のメソッド中に存在するかどうかを判断します。
advice1の場合、withincodeが解釈されるとき(callのみ解釈した段階)に
JoinPointはfunc1メソッド内に存在します。
よって、このとき withincode(* func1(..)) が成立するので
advice1のJoinPointは上の箇所になります。
一方advice2の場合、withincodeが解釈されるときのJoinPointは
func2メソッド内に存在します(「JoinPointの位置」参照)。
このとき withincode(* func1(..)) は成立しません。
よって、advice2に当てはまるJoinPointはこのコード中には存在しないことになります。
within のときと同じように、thisの挙動も変わります。