我有以下几个方面:
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完成,但过滤器只是一个例子).
谢谢,
林
解决方法:
这对我有用:
pointcut intercept_call() : call(public * execute(java.lang.String, ..));
before(String val): intercept_call() && !cflowbelow(intercept_call()) && args(val, ..)
{
// do soemthing
}
}
不知道它是否符合您的要求.