边城愚人

如果我不在边城,我一定是在前往边城的路上。

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  31 随笔 :: 0 文章 :: 96 评论 :: 0 Trackbacks

        call execution 的指示符分别为 call Method-Signature )、 execution Method-Signature ),匹配方法签名的方法或构造函数的执行。 对于 call 来说,调用的连接点位于方法调用点的调用代码处;对于 execution 来说,执行的连接点位于方法执行的位置。也就是说, call execution 的重要区别在于它们传递了哪些类型给 AspectJ 编译器以用来与 aspect 进行链接。

        通常,我们在使用 call execution 时,从效果上来看并不会觉察出二者的区别。下面给出一个例子说明 call execution 的运行时机及区别。

     

public class A  {
    
public void foo(){
        System.out.println(
"A.foo()");
    }
}

public class Main {
    
public void callFoo(A a){
        a.foo();
    }
    
public static void main(String[] args) {    
        Main m 
= new Main();
        m.callFoo(
new A());
    }
}

        1 )现在我看一下下面使用 call 的切面:

                        aspectj.png

   

           该切面定义了一个切入点callA(Object o,Object t),其中this(o)表示将匹配的连接点的对象赋给otarget(t)表示将匹配的连接点的目标对象赋给t。输出结果为:


           aspectj-3.png

        

        输出表明,this的类(调用类)为Maintarget的类(目标类)为A我们再看一下Main类:


       aspectj-2.png


        在AJDT下,可以看到,call切入点匹配的位置在调用类(Main)的方法void callFoo(A a)中,而不是在目标类A中。

        2)再来看一下execution的例子:


       aspectj-4e.png


      aspectj-f.png


        在这个方面中,切入点没有使用thistarget,而是在before通知中使用了AspectJAPI达到同样的效果。可以看到,切入点executionA()匹配的连接点的位置在Afoo()方法,这和上面的call匹配的连接点的位置是不同的。

       aspectj-7t.png

    

      

        从输出可以看到,在execution中,thistarget指向同一个类。在call中,thistarget不是指向同一个类

        executioncall还有一点很重要的区别。对于继承类来说,如果它没有覆盖父类的方法,那么execution不会匹配子类中没有覆盖父类的方法。比如说我们有一个类B继承于A,但没有覆盖A类的foo(),那么对于B的实例的foo()方法,execution(* B.foo())将不会被匹配。

        做个总结,如果想跟踪连接点的内部代码运行情况可以考虑使用execution,但如果你只关心连接点的签名(比如你使用第三方库或是标准API),则使用call

        注:该文参考了《Eclipse AspectJ》和《AspectJ cookbook》。


posted on 2007-07-12 09:50 kafka0102 阅读(4124) 评论(6)  编辑  收藏 所属分类: AOP

评论

# re: AspectJ学习(3)使用切入点 call和execution 2008-04-27 10:53 wxyhibernate
谢谢
  回复  更多评论
  

# re: AspectJ学习(3)使用切入点 call和execution 2008-08-16 11:05 xiaozhang206
非常感谢,高手!  回复  更多评论
  

# re: AspectJ学习(3)使用切入点 call和execution[未登录] 2008-10-24 12:48 Java爱好者
好文章,自己正在学习AspectJ,不过全是英文版!觉得有点迷惑,看了你的文章,有些东西,豁然开朗!  回复  更多评论
  

# re: AspectJ学习(3)使用切入点 call和execution 2009-07-08 14:31 sheng
谢谢  回复  更多评论
  

# re: AspectJ学习(3)使用切入点 call和execution 2009-08-26 15:47 eva
请问,call 可以拦截到 间接调用的方法吗?
例如 一个类里的A方法调用B 方法,可以拦截到B吗?
我现在遇到的问题是不知道怎么拦截 间接方法调用  回复  更多评论
  

# re: AspectJ学习(3)使用切入点 call和execution 2010-11-17 17:15 可可
相当好的文章,博主要是把这个系列写下去,必然是AspectJ的引路人啊

谢谢博主  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: