在我的方面,我通过建议某些方法调用java.util.Set
,特别是add(Object)
和remove(Object)
,来跟踪某些集合的更改。由于这些更改未反映在集合本身中,所以Set.contains(Object)
或Set.size()
的调用返回错误的结果。使用连接点调用(* *。*(..)),如果可用,我可以将参数公开给建议吗?
因此,我想截取所有方法调用的集合实例(除add
和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) {...}`
这是可能的吗?我感觉它不是,因为在一个切入点中我公开了这个参数(并且随后在建议中使用它),另一个没有参数,所以似乎不可能在封装的通知中绑定“潜在标识符” ......但我希望我忽略了一些事情,并且可能能够指引我朝着正确的方向前进。谢谢!
我不明白这个答案。 – kriegaex 2017-05-29 03:41:50