私のアスペクトではjava.util.Set
、 、特にadd(Object)
とのインスタンスで特定のメソッド呼び出しをアドバイスすることにより、特定のコレクションの変更を追跡しますremove(Object)
。変更はコレクション自体には反映されないため、 を呼び出しSet.contains(Object)
たり、Set.size()
間違った結果を返したりします。
add
したがって、Set のインスタンス (とを除く) へのすべてのメソッド呼び出しをインターセプトしremove
、その呼び出しを最新のコレクションに転送したいと考えています。
もちろん、異なるポイントカットを使用して、次のような 2 つのアドバイスを定義することもできます。
// matches Collection.size(), Collection.isEmpty(), ...
* around(Collection c) : call(* Collection.*()) && target(c)
&& !remove(/*...*/) && !add(/*...*/) {
if (notApplicable())
return proceed(c);
return proceed(getUpToDateCollection());
}
// matches Collection.contains(Object), ...
* around(Collection c, Object arg) : call(* Collection.*(*)) && target(c) && args(arg)
&& !remove(/*...*/) && !add(/*...*/) {
if (notApplicable())
return proceed(c, arg);
return proceed(getUpToDateCollection(), arg);
}
それは機能しますが、かなり醜いです。私のアドバイスの本文は非常に類似しています。だから私はそれらを「結合」したいと思います。次のように、両方のポイントカットに織り込まれた単一のアドバイスを効果的に持つことができます。
* around(Object[] args): call(* Collection.*(..)) && args(arr) {...}`
これはまったく可能ですか?ポイントカットの1つでは引数を公開し(その後アドバイスで使用します)、もう1つのポイントカットには引数がないため、同封のアドバイスで「潜在的な識別子」をバインドすることは不可能に思われるため、そうではないと感じています...しかし、私は何かを見落としていて、正しい方向に私を向けることができるかもしれないことを願っています. ありがとう!