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

时间:2016-11-24 11:51:25

标签: java aspectj

我有以下方面:

public aspect MyAspect {

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

以下课程A& B,A使用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来完成,但过滤器只是一个例子)。

谢谢,

1 个答案:

答案 0 :(得分:3)

这对我有用:

        adapter = new SQLiteDataAdapter();

        selcmd = new SQLiteCommand();
        selcmd.CommandText = "...";
        adapter.SelectCommand = selcmd;

        upcmd = new SQLiteCommand();
        upcmd.CommandText = "...";
        adapter.UpdateCommand = upcmd;

        delcmd = new SQLiteCommand();
        delcmd.CommandText = "...";
        adapter.DeleteCommand = delcmd;

        inscmd = new SQLiteCommand();
        inscmd.CommandText = "...";
        adapter.InsertCommand = inscmd;

不知道它是否符合您的要求。