边城愚人

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

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  30 随笔 :: 0 文章 :: 57 评论 :: 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 阅读(851) 评论(1)  编辑  收藏 所属分类: AOP

评论

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




标题  
姓名  
主页
验证码 *  
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交