С моим аспектом я отслеживаю изменения в определенных коллекциях, посоветовав определенные вызовы методов для экземпляров java.util.Set
, в частности add(Object)
и remove(Object)
. Поскольку изменения не отражаются в самой коллекции, вызовы Set.contains(Object)
или Set.size()
возвращают неверные результаты.
Поэтому я хочу перехватить все вызовы методов для экземпляров Set (кроме 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) {...}`
Возможно ли это вообще? У меня такое ощущение, что это не так, потому что в одном из баллов я выставляю аргумент (и впоследствии использую его в совете), а в другом нет аргумента, поэтому кажется невозможным связать «потенциальный идентификатор» в прилагаемом совете ... Но я надеюсь, что что-то упустил, и вы могли бы указать мне правильное направление. Спасибо!