分享

Aspectj中call与execution区别,织入代码位置不同

 jasonbetter 2019-09-11

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/Dax1n/article/details/81944975

call 调用通知的环境是方法调用位置;而execution是方法执行位置,也就是方法签名处。

具体结合一个示例可以更简单跟容易理解:

1、pointcut配置:

    pointcut callPointCut():execution(public void com.javartisan.aspectj1.HelloWorld.say(String));

此时是执行环境,查看一下被织入切面之后的字节码:

//

// Source code recreated from a .class file by IntelliJ IDEA

// (powered by Fernflower decompiler)

//

package com.javartisan.aspectj;

import com.javartisan.aspectj.HelloWorldAspect;

public class HelloWorld {

    public HelloWorld() {

    }

    public void say() {

        try {

            HelloWorldAspect.aspectOf().ajc$before$com_javartisan_aspectj_HelloWorldAspect$1$88992c11();

            System.out.println("Hello World!");

        } catch (Throwable var2) {

            HelloWorldAspect.aspectOf().ajc$after$com_javartisan_aspectj_HelloWorldAspect$2$88992c11();

            throw var2;

        }

        HelloWorldAspect.aspectOf().ajc$after$com_javartisan_aspectj_HelloWorldAspect$2$88992c11();

    }

    public static void main(String[] args) {

        (new HelloWorld()).say();

    }

}

2、pointcut配置

    pointcut callPointCut(String name, int age):call(public void com.javartisan.aspectj2.HelloWorld.say(String,int))&&args(name,age);

织入切面的字节码如下:

//

// Source code recreated from a .class file by IntelliJ IDEA

// (powered by Fernflower decompiler)

//

package com.javartisan.aspectj;

import com.javartisan.aspectj.HelloWorldAspect;

public class HelloWorld {

    public HelloWorld() {

    }

    public void say() {

        System.out.println("Hello World!");

    }

    public static void main(String[] args) {

        HelloWorld var10000 = new HelloWorld();

        try {

            HelloWorldAspect.aspectOf().ajc$before$com_javartisan_aspectj_HelloWorldAspect$1$88992c11();

            var10000.say();

        } catch (Throwable var2) {

            HelloWorldAspect.aspectOf().ajc$after$com_javartisan_aspectj_HelloWorldAspect$2$88992c11();

            throw var2;

        }

        HelloWorldAspect.aspectOf().ajc$after$com_javartisan_aspectj_HelloWorldAspect$2$88992c11();

    }

}

对比1与2可以知晓:

call是在调用处进行织入通知代码,而对于execution是在连接点方法内部织入通知代码。

————————————————

版权声明:本文为CSDN博主「javartisan」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/Dax1n/article/details/81944975

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多