【问题标题】:Pointcut to match all calls to public methods, except calls to self切入点匹配对公共方法的所有调用,除了对 self 的调用
【发布时间】:2011-03-24 22:28:09
【问题描述】:

我正在尝试编写一个方面来监视对各种对象的公共方法的调用,但忽略对 self 的调用。为此,我有这样一个方面:

抽象方面 MonitorPublicMethodCalls { 抽象切入点matchingType(); 切入点matchingCall(): call(public * *(..)); 切入点 notSelf(); 周围的对象(对象 t):matchingType()&&matchingCall()&& notSelf(){ // 对调用做一些有用的事情 if(/* 允许调用?*/) { 返回进行(); } 别的 { throw new IllegalStateException("Badness!"); } } }

这将监控对所有公共方法的所有调用,但为了忽略对 self 的调用,我真的很想将 notSelf 定义为类似

pointcut notSelf(Object o): target(o) && !this(o)

但是,为此我得到一个错误:“否定不允许绑定”对this(o) 的否定。现在,作为一种解决方法,我在建议正文中检查目标是否等于此,如果是则绕过其他逻辑,但这意味着该方面被编织到比实际需要更多的地方。是否可以定义一个约束来避免调用 self?

【问题讨论】:

    标签: java aop aspectj


    【解决方案1】:

    试试这个:

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

    【讨论】:

    • 谢谢,直到看到这个具体的例子,我才明白条件表达式的作用。但是,根据 AspectJ 文档,如果切入点表达式“将在运行时为每个候选连接点进行评估”:eclipse.org/aspectj/doc/released/adk15notebook/… 所以,这最终会成为我在我的正文中已经做的稍微干净的版本建议作为解决方法。我希望有人可能知道一种方法,可以静态消除连接点候选者。
    • 没有办法静态判断调用的目标是否与调用者相同。对象是一个运行时概念,因此需要在运行时做出决策。
    • 总的来说,是的,我想你是对的。有明显的“this.x()”类型调用,但更广泛的情况是确定您是否有自己的别名,更难以静态推断。无论如何,由于没有其他人提供任何选项,我会接受您的回答,谢谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-03
    • 1970-01-01
    • 2011-08-16
    • 1970-01-01
    • 2011-09-19
    相关资源
    最近更新 更多