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

 

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是在连接点方法内部织入通知代码。

 

在Eclipse的SWT项目集成AspectJ进行类装载时织入(AOP - Aspect Oriented Programming),通常需要以下几个步骤: 1. **添加AspectJ依赖**: 首先,在你的项目添加AspectJ库作为Maven或Gradle的依赖。例如在Maven,可以在pom.xml文件添加: ```xml <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.5</version> </dependency> ``` 2. **创建Aspect类**: 创建一个Aspect类,编写你需要在运行时动态插入的切面代码。比如,我们有一个简单的日志通知切面: ```java package com.example.aspect; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; @Aspect public class LoggingAspect { @Before("execution(* com.example.service.*(..))") public void logMethodExecution(JoinPoint joinPoint) { System.out.println("Executing method: " + joinPoint.getSignature().getName()); } } ``` 3. **配置类路径和织入点**: 使用AspectJ Maven或Gradle插件配置编译时的织入(Weaving)。在`pom.xml`或`.gradle`文件设置AspectJ构建器。 对于Maven,添加到`build/plugins`部分: ```xml <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>aspectj-maven-plugin</artifactId> <version>1.9.0</version> <executions> <execution> <goals> <goal>compile</goal> <goal>test-compile</goal> </goals> </execution> </executions> <configuration> <complianceLevel>${java.version}</complianceLevel> <!-- 其他配置项如source和target --> < weaveDependencies>true</weaveDependencies> </configuration> </plugin> ``` 4. **运行应用**: 现在编译你的项目,AspectJ会自动将织入的代理类包含进你的类路径。当运行SWT应用程序时,它将会按照你定义的方式对目标类的行为进行增强。 注意:AspectJ织入是在编译阶段完成的,所以你需要在Eclipse编译并部署才能看到效果。另外,如果在运行时修改了Aspect类,你需要重启Eclipse或重新编译项目才能生效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值