我已经提到过AspectJ引用here,它指出“cflow”是
这对我来说并不完全清楚,我想知道是否有人可以详细说明cflow的含义?为什么要使用它?
的确感谢。
最佳答案
cflow帮助您建议整个控制流程。让我们尝试一个例子,我有4个小类
public class A {
public static void methodA() {
B.methodB();
}
}
public class B {
public static void methodB() {
C.methodC();
int a = 1;
int b = 2;
System.out.println( a + b );
}
}
public class C {
public static void methodC() {
D.methodD();
}
}
public class D {
public static void methodD() {
}
}
我的方面:
public aspect CFlow {
public pointcut flow() : cflow(call( * B.methodB() ) ) && !within(CFlow);
before() : flow() {
System.out.println( thisJoinPoint );
}
}
和我的运行者(只是看看会发生什么):
public class Test {
public static void main(String[] args) {
A.methodA();
}
}
在我的切入点中,您可能会看到
cflow(call( * B.methodB() ) )
,因此我想从B.methodB
调用开始进行方面控制流,并在运行Test类时在控制台上看到:call(void test.B.methodB())
staticinitialization(test.B.<clinit>)
execution(void test.B.methodB())
call(void test.C.methodC())
staticinitialization(test.C.<clinit>)
execution(void test.C.methodC())
call(void test.D.methodD())
staticinitialization(test.D.<clinit>)
execution(void test.D.methodD())
get(PrintStream java.lang.System.out)
call(void java.io.PrintStream.println(int))
3
最后一个字符串不属于aspect,仅是因为
System.out.println
中的methodB
。所有显示的内容都显示了控制流程的方法-方法和“事件”链(执行,调用,初始化...)。您会看到,我从Test
类开始,该类称为methodA
,但它们不在“堆栈”中,因为我们对methodB
控制流感兴趣。如果要获取该堆栈,但没有第一行(调用自身),则可以尝试定义
public pointcut flow() : cflowbelow(call( * B.methodB() ) ) && !within(CFlow);
cflowbelow是另一个切入点,这意味着控制流不包括指定的流(在本例中为
B.methodB
)。请注意在切入点中添加
!within(_aspect_)
,否则,除了StackOverflowError
之外,您将一无所获。发生这种情况是因为无法在编译时定义cflow,并且在运行时方面也属于控制流(因此导致永恒的递归...)好吧,将控制流视为类似于调用堆栈,那么您将了解其用法;)
关于java - 面向方面的编程- 'cflow'是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5205916/