我已经提到过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/

10-13 22:06