禁用AspectJ以if()方法和用户输入停止建议方法

时间:2016-06-16 15:31:52

标签: java maven aspectj

我正在使用带注释的AspectJ,并试图找到如何禁用所有AspectJ的建议,以停止从用户的输入建议方法(例如,Boolean tracked = false)。

这是我的主类代码。

package testMaven;


public class MainApp {

    public static void main(String[] args) {
        testing test = new testing();
        test.aa(1000);
        test.setDd(3);
    }

}

这是Aspect注释类。

package testMaven;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.annotation.Before;

@Aspect
public class aspecter {

    public aspecter(){

    }

    boolean tracked = false;

    @Before("execution(*  testMaven.testing.aa(..)) && if(tracked)")
    public void testBefore(){
        System.out.println("yooi");
    }

    @Before("execution(*  testMaven.testing.setDd(..)) && if(tracked) ")
    public void testBefore2(){
        System.out.println("yooi2");
    }
}

if(tracked)将给出“令牌上的语法错误”执行错误(* testMaven.testing.aa(..))&& if(tracked)“,”在注释样式中,如果(...)切入点不能包含代码。使用if()并将代码放在带注释的方法“expected”中。

无论如何我可以根据我的规范指定if()方法吗?

由于

1 个答案:

答案 0 :(得分:4)

如果使用注释样式,则必须以不同的方式执行操作,如文档所述(https://eclipse.org/aspectj/doc/released/adk15notebook/ataspectj-pcadvice.html)。在您的情况下,您的方面必须是这样的:

static boolean tracked = false;

@Pointcut("if()")
public static boolean tracked() {
  return tracked;
}

@Before("execution(*  testMaven.testing.aa(..)) && tracked()")
public void testBefore(){
    System.out.println("yooi");
}

@Before("execution(*  testMaven.testing.setDd(..)) && tracked() ")
public void testBefore2(){
    System.out.println("yooi2");
}

请注意,代码样式方面通常会进入if(...)子句的代码现在位于方法体中,使用@Pointcut标记为if()。我确实必须让场地保持静止。您可以修改tracked()方法中的代码,以使用Aspects.aspectOf()来保持非静态。