У меня есть следующий аспект:AspectJ - Избегайте срезы в называющей себя косвенно
public aspect MyAspect {
before(String val): args(val, ..) &&
call(public * execute(java.lang.String, ..)) {
// Do something
}
}
И следующие классы & 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.execute() непосредственно из теста я хочу, чтобы поймать аспект b.execute().
Как это можно достичь? Я попытался использовать cflowbelow (с отрицанием), но это не сработало.
---- редактировать ----
Чтобы быть более точным, давайте Явы FilterChain.doFilter (..) - фильтры могут вызывать другие фильтры. Я только хочу поймать первый вызов doFilter (я знаю, что это может быть сделано с использованием ThreadLocal в случае fiter, но фильтр - только пример).
Спасибо,
Lin
Имейте попытку &&! Внутри (A)? – dreamcrash
Нет, потому что я не хочу исключать A. Если тест был только a.execute (""), я хочу поймать этот вызов. – Lin
Временное решение может быть: вы сохраняете имя метода в treeSet для проверки или нет, если вы уже перехватили этот метод до – dreamcrash