精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2004-02-23
在分析例子的时候,我都是对编译过的class类,进行反编译,基本上可以看出来AspectJ在那写位置上,插入了什么样的代码。可是cflow,target等概念似乎从结果上无法明显的体现出来,请问各位老师介绍一下这些概念和学习经验. 谢谢~ 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间: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,不一定对 。 |
|
返回顶楼 | |
发表时间:2004-02-23
又研究了一下,针对你这个例子,讲讲。
[list] CafeBabe 写道 <<call(* CflowTest.f(..)) && cflow(call(* CflowTest.foo(..))); >> [/list:u]
意思是切点是调用CflowTest.f(..),但是有过滤条件,就是调用的堆栈中必须包含符合条件的调用。这个条件就是-- 调用CflowTest.foo. 修改一下例子效果能好一些. 改称>>> [list] CafeBabe 写道 call(* CflowTest.f(..)) &&
[/list:u]
cflow(call(* CflowTest.bar(..))); 这样在 [list] CafeBabe 写道 public void foo(){
[/list:u]
bar(); f(); } 的时候,等于过滤到了f();而结果只会出现一次提示("before call f()")。 再修改 >>> [list] CafeBabe 写道 call(* CflowTest.f(..)) &&
[/list:u]
cflow(call(* CflowTest.pppppp(..))); 提示一词也没有了,因为全都过滤掉了。 好 修改回去 改称 [list] CafeBabe 写道 call(* CflowTest.f(..)) && cflow(call(* CflowTest.bar(..))); [/list:u]
马上修改 [list] CafeBabe 写道 public void foo(){
[/list:u]
// bar(); -->注释掉 f(); } 发现过在滤条件下无效,因为堆栈中没有了call bar(). |
|
返回顶楼 | |
发表时间: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) 是有意义的呢? |
|
返回顶楼 | |
发表时间: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)就不一样了。 |
|
返回顶楼 | |
发表时间:2004-02-24
cflow(P && Q)--> p,q接获的2个joinpoint确实不能重复(仅就以上情况),所以cflow(P && Q)也就没有joinpoint。
那么cflow(P) && cflow(Q)呢?分别的2个joinpoint。 用&& 连接起来。。。。。 什么意思呢? |
|
返回顶楼 | |
发表时间: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))? |
|
返回顶楼 | |
发表时间:2004-02-24
:( 不好意思,是我说错了。 应该是pointcut,而不是joinpoint。
引用 cflow(P) && cflow(Q)不就和p && q一样吗(其中p=cflow(P),q=cflow(Q))?
您的意思是 cflow(P) && cflow(Q) cflow(P && Q) 一样吗? 如果不一样,可否告诉我他们的差异。还是没有怎么明白。。。 |
|
返回顶楼 | |
发表时间: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)中的&&的意思。 |
|
返回顶楼 | |
发表时间:2004-02-24
可否给一个可以区分他们两个的例子~
|
|
返回顶楼 | |