论坛首页 Java企业应用论坛

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

浏览 10967 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2004-02-23  
看了AspectJ一段时间,也分析了几个例子。其中切点中有些容易理解。例如execution/call,而对于其他的,例如cflow,则比较难以理解。

在分析例子的时候,我都是对编译过的class类,进行反编译,基本上可以看出来AspectJ在那写位置上,插入了什么样的代码。可是cflow,target等概念似乎从结果上无法明显的体现出来,请问各位老师介绍一下这些概念和学习经验.

谢谢~
   发表时间:2004-02-23  
cflow就是control flow(控制流?)
cflow(Pointcut):every join point in the control flow of each join point P picked out by Pointcut, including P itself 

比如有类:
public class CflowTest{
	public void foo();{
		bar();;
		
		f();;
	}
	
	public void bar();{
		f();;
	}
	
	public void f();{
		System.out.println("CflowTest.f();");;
	}
	
	public static void main(String[] args);{
		CflowTest c=new CflowTest();;
		
		c.foo();;
	}
}


aspect:
public aspect Aspect1{
    pointcut callF();:
		call(* CflowTest.f(..);); &&
		cflow(call(* CflowTest.foo(..);););;

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

这样就pick out了对f()的两次call,
一次是foo()中对bar()的调用,而bar()中又call了f()
另一次是在foo()中对f()的直接call
我也是初学aspectj,不一定对
0 请登录后投票
   发表时间:2004-02-23  
又研究了一下,针对你这个例子,讲讲。

[list]
CafeBabe 写道
<<call(* CflowTest.f(..)) &&  cflow(call(* CflowTest.foo(..))); >>
[/list:u]

意思是切点是调用CflowTest.f(..),但是有过滤条件,就是调用的堆栈中必须包含符合条件的调用。这个条件就是-- 调用CflowTest.foo.


修改一下例子效果能好一些.
改称>>>
[list]
CafeBabe 写道
call(* CflowTest.f(..)) &&
      cflow(call(* CflowTest.bar(..)));
[/list:u]

这样在

[list]
CafeBabe 写道
public void foo(){
      bar();
      
      f();
   }
[/list:u]

的时候,等于过滤到了f();而结果只会出现一次提示("before call f()")。

再修改
>>>
[list]
CafeBabe 写道
call(* CflowTest.f(..)) &&
      cflow(call(* CflowTest.pppppp(..)));
[/list:u]

提示一词也没有了,因为全都过滤掉了。

好 修改回去
改称

[list]
CafeBabe 写道
call(* CflowTest.f(..)) && cflow(call(* CflowTest.bar(..)));
[/list:u]

马上修改
[list]
CafeBabe 写道
  public void foo(){
      // bar();   -->注释掉
      
      f();
   }
[/list:u]

发现过在滤条件下无效,因为堆栈中没有了call bar().
0 请登录后投票
   发表时间:2004-02-23  
又引发一个问题
官方教程中有这样的比较

cflow(P) && cflow(Q)

cflow(P && Q)

反覆想也没有看懂。 根据是上面的例子。如果p = call (* CflowTest.foo());

q =  call (* CflowTest.bar());

那么
cflow(P && Q) 代表什么含义? foo() 和bar()之间有可能有&&关系马? 他们是一个包含另一个的关系。如果看作两个圆,那结果自然是bar了。可是运行效果好像不是。

另外,foo()包含bar(),是否在bar中的所有触发点他也能够捕获到呢? 我做得试验结果是不能的。

那什么样的情况下cflow(P && Q) 是有意义的呢?
0 请登录后投票
   发表时间:2004-02-24  
cflow(P && Q); 代表什么含义? foo(); 和bar();之间有可能有&&关系马?
他们是一个包含另一个的关系。如果看作两个圆,那结果自然是bar了。可是运行效果好像不是。 

你可能有些误会。aspectj中的pointcut(比如P和Q)只不过一种正则表达式罢了。
P && Q的意思就是选取同时符合这两个正则表达式的joinpoint,也就是P选取的joinpoint和Q选取的joinpoint的交集。

如果p = call (* CflowTest.foo()); q = call (* CflowTest.bar()); ,那显然P && Q什么也选取不到,因为不可能有哪个方法,名字既是foo又是bar。因此
cflow(P && Q)也什么都选取不到。
但cflow(P) && cflow(Q)就不一样了。
0 请登录后投票
   发表时间:2004-02-24  
cflow(P && Q)--> p,q接获的2个joinpoint确实不能重复(仅就以上情况),所以cflow(P && Q)也就没有joinpoint。

那么cflow(P) && cflow(Q)呢?分别的2个joinpoint。
用&& 连接起来。。。。。


什么意思呢?
0 请登录后投票
   发表时间:2004-02-24  
引用

那么cflow(P) && cflow(Q)呢?分别的2个joinpoint。
用&& 连接起来。。。。。

joinpoint和pointcut是有区别的吧,pointcut是aspectj提出来的,像call(..)...这些都是pointcut,一个pointcut可以选取出一些joinpoint。


cflow(P) && cflow(Q)不就和p && q一样吗(其中p=cflow(P),q=cflow(Q))?
0 请登录后投票
   发表时间:2004-02-24  
:( 不好意思,是我说错了。 应该是pointcut,而不是joinpoint。

引用
cflow(P) && cflow(Q)不就和p && q一样吗(其中p=cflow(P),q=cflow(Q))?


您的意思是
cflow(P) && cflow(Q)

cflow(P && Q)

一样吗?

如果不一样,可否告诉我他们的差异。还是没有怎么明白。。。
0 请登录后投票
   发表时间:2004-02-24  
引用

您的意思是
cflow(P) && cflow(Q)

cflow(P && Q)

一样吗?

如果不一样,可否告诉我他们的差异。还是没有怎么明白。。。

那么cflow(P) && cflow(Q)呢?分别的2个joinpoint。
用&& 连接起来。。。。。

我不是这个意思,cflow(P) && cflow(Q)和cflow(P && Q)这两个意义肯定是不一样的。
我以为你不清楚cflow(P) && cflow(Q)中的&&的意思。
0 请登录后投票
   发表时间:2004-02-24  
可否给一个可以区分他们两个的例子~
0 请登录后投票
论坛首页 Java企业应用版

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