切入点以匹配对公共方法的所有调用,除了对self的调用

时间:2011-03-24 22:28:09

标签: java aop aspectj

我正在尝试编写一个方面来监视对各种对象的公共方法的调用,但忽略对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?

1 个答案:

答案 0 :(得分:2)

试试这个:

pointcut selfAndTarget(Object tgt, Object thiz) : target(tgt) && this(thiz)
pointcut notSelf(): selfAndTarget(tgt, thiz) && if(tgt != thiz)