有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java AspectJ避免切入点间接调用自己

我有以下几点:

public aspect MyAspect {

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

以及以下课程A&BA使用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(带否定),但没用

----编辑---

更准确地说,让我们以java的FilterChain.doFilter(..)为例——过滤器可以调用其他过滤器。我只想捕捉对doFilter的第一个调用(我知道在fiter的情况下可以使用ThreadLocal,但是filter只是一个例子)


共 (1) 个答案

  1. # 1 楼答案

    这样做可以:

    pointcut intercept_call() : call(public * execute(java.lang.String, ..));
    
    
    before(String val): intercept_call() && 
                        !cflowbelow(intercept_call()) 
                         && args(val, ..)
                        {    
                            // Do something
                        }