我正在尝试编写一个方面来监视对各种对象的公共方法的调用,但忽略对self的调用。为此,我有这样一个方面:
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!"); } } }
这将监视对所有公共方法的所有调用,但是为了忽略对self的调用,我真的想将notSelf
定义为
pointcut notSelf(Object o): target(o) && !this(o)
然而,对于这个我得到一个错误:“否定不允许绑定”this(o)
的否定。现在作为一种解决方法,我在建议体内检查目标是否与此相等,如果是这样,则绕过其他逻辑,但这意味着该方面被编织到比实际需要更多的位置。是否可以定义约束以避免调用self?
答案 0 :(得分:2)
试试这个:
pointcut selfAndTarget(Object tgt, Object thiz) : target(tgt) && this(thiz)
pointcut notSelf(): selfAndTarget(tgt, thiz) && if(tgt != thiz)