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

标签 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 的 first 调用(我知道这可以在 fiter 的情况下使用 ThreadLocal 完成,但过滤器只是一个示例)。

最佳答案

这样做:

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


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

关于java - AspectJ - 避免切入点间接调用自己,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40785694/

相关文章:

java - 获取字符串的一部分

java - 当我在 autocompletetextview 中输入空格键时,我的应用程序崩溃了

java - targetSdkVersion 30,不提示用户权限

class - 如何在 AOP(面向方面​​的编程)中使用单例类?

java - 除了已部署的 WAR,AspectJ CTW 编织在任何地方都有效?

java - 如何在AspectJ中使用@After和@AfterThrowing之一?

java - 应用多个方面是否安全?

java - 需要将拉绳置于绘图图像的中心

java - 如何取消 Google App Engine 插件的身份验证?

java - 使用maven-compiler-plugin和aspectj-maven-plugin进行编译