我有以下几个方面:
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 的 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/