论坛首页 Java企业应用论坛

提问:AspectJ中cflow的触发时机?

浏览 10962 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2004-02-24  
public aspect Aspect1{
	
	pointcut p();:
		call(* CflowTest.foo(..););;
		
	pointcut q();:
		call(* CflowTest.bar(..););;
				
	/*before();: cflow( p(); && q(); );{
	  System.out.println("before: "+thisJoinPoint);;
	}*/		
	
	before();: cflow(p();); && cflow(q();); && !within(Aspect1);{
	  System.out.println("before: "+thisJoinPoint);;
	}
}

加上&& !within(Aspect1)是为了防止死循环
0 请登录后投票
   发表时间:2004-02-27  
public aspect Aspect1{
    pointcut callF();:
		call(* CflowTest.f(..);); &&
		cflow(call(* CflowTest.foo(..);););;

    before();: callF();{
	  System.out.println("before call f();");;
	}
}


如图
0 请登录后投票
   发表时间:2004-02-27  
public aspect Aspect1{
    pointcut callF();:
		call(* CflowTest.f(..);); &&
		cflow(call(* CflowTest.bar(..);););;

    before();: callF();{
	  System.out.println("before call f();");;
	}
}


如图
0 请登录后投票
   发表时间:2004-04-08  
你们好像没有讨论清楚,可以看看这里
引用

切点合成

切点可以使用操作符与(&&)、或(||)和非(!)。这样可以使用简单的原始切点来创建强大功能的切点。当使用原始切点cflow和cflowbelow进行组合时,可能会有些迷糊。例如,cflow(p)捕捉p流程内(包括P在内)的所有连接点,可以使用图形表示

P ---------------------

\

\ cflow of P

\

那么cflow(P) && cflow(Q)捕捉的是什么呢?它捕捉同时处于P和Q流程中的连接点。

P ---------------------
\
\ cflow of P
\
\
\

Q -------------\-------
\ \
\ cflow of Q \ cflow(P) && cflow(Q)
\ \

注意P和Q可能没有任何公共的连接点,但是它们的程序流程中可能有公共的连接点。

Cflow(P && Q)又是什么意思呢?它的意思是被P和Q共同捕捉的连接点的流程。

P && Q -------------------
\
\ cflow of (P && Q)
\

如果P和Q没有捕捉到公共的连接点,那么在(P&&Q)的程序流程中不可能有任何连接点。下面代码表明上述意思

public class Test {
public static void main(String[] args) {
foo();
}
static void foo() {
goo();
}
static void goo() {
System.out.println("hi");
}
}

aspect A {
pointcut fooPC(): execution(void Test.foo());
pointcut gooPC(): execution(void Test.goo());
pointcut printPC(): call(void java.io.PrintStream.println(String));
before(): cflow(fooPC()) && cflow(gooPC()) && printPC() {
System.out.println("should occur");
}

before(): cflow(fooPC() && gooPC()) && printPC() {
System.out.println("should not occur");
}
}
0 请登录后投票
   发表时间:2004-04-08  
比如说fooPc()&&gooPc(),代表了它们的定义中的连接点的一个交集,而非这两个切点流程的交集。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics