Я пытаюсь написать аспект, который отслеживает вызовы общедоступных методов для различных объектов, но игнорирует обращения к себе. Для этого у меня есть такой аспект:
abstract aspect MonitorPublicMethodCalls { abstract pointcut matchingType(); pointcut matchingCall(): call(public * *(..)); pointcut notSelf(); Object around(Object t): matchingType() && matchingCall() && notSelf() { // do something useful with the call if(/* allow call? */) { return proceed(); } else { throw new IllegalStateException("Badness!"); } } }
Это будет отслеживать все вызовы всех общедоступных методов, но чтобы игнорировать вызовы себе, я бы действительно хотел определить notSelf
как что-то вроде
pointcut notSelf(Object o): target(o) && !this(o)
Однако при этом я получаю сообщение об ошибке: «отрицание не допускает привязки» при отрицании this(o)
. Прямо сейчас в качестве обходного пути я проверяю в теле совета, совпадает ли цель с этой, и если да, то обхожу другую логику, однако это означает, что аспект вплетен в большее количество мест, чем это действительно необходимо. Можно ли определить ограничение, чтобы избежать обращений к себе?