AspectJ - 避免间接称呼自己的切入点



我有以下方面:

public aspect MyAspect {
before(String val): args(val, ..) &&
call(public * execute(java.lang.String, ..)) {
// Do something
}
}

以下类ABA使用B

class A() {
public void execute(String a) {
// Do something...
B b = new B();
b.execute();
}
}
class B {
public void execute(String a) {
// Do something
}
}

我有一个测试类:

public class TestClass {
public static void main(String[] args) {
A a = new A();
a.execute("someVal"); // I want the aspect to be called for the first execute only
B b = new B();
b.execute("someVal");    
}
}
  • 如果我们调用a.execute(),我不希望在B上再次捕获执行方面。
  • 另一方面,当我们直接从测试中调用b.execute()时,我确实希望方面能够捕获 b.execute()。

如何实现这一点?我尝试使用cflowbelow(带有否定),但它不起作用。

----编辑----

更准确地说,让我们以 javaFilterChain.doFilter(..)为例——过滤器可以调用其他过滤器。我只想捕获对doFilter的第一次调用(我知道这可以在更合适的情况下使用ThreadLocal来完成,但过滤器只是一个示例)。

这将做:

pointcut intercept_call() : call(public * execute(java.lang.String, ..));

before(String val): intercept_call() && 
!cflowbelow(intercept_call()) 
&& args(val, ..)
{    
// Do something
}

最新更新