java.util.Set
就我而言,我通过建议对 的实例(尤其是add(Object)
和)的某些方法调用来跟踪某些集合的更改remove(Object)
。由于更改未反映在集合本身中,因此调用Set.contains(Object)
或Set.size()
返回错误结果。
因此,我想拦截对 Set 实例的所有方法调用(除了add
and remove
),并将调用转发到我的最新集合。
当然,我可以使用不同的切入点定义两个建议,如下所示:
// 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) {...}`
这可能吗?我感觉不是,因为在其中一个切入点中我公开了参数(随后在建议中使用它),而在另一个切入点中没有参数,因此似乎不可能在封闭建议中绑定“潜在标识符” ......但我希望我忽略了一些事情,你也许能指出我正确的方向。谢谢!