`
gaojian881
  • 浏览: 7195 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

aspectj中call和execution的区别

 
阅读更多

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

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

MyAspectj中的代码:

public aspect MyAspectj {

  pointcut callF(): call(* f(..));  
  before() : callF() {  
    System.out.println("before call f()");
    System.out.println(thisJoinPoint.getThis());
    System.out.println(thisJoinPoint.getTarget());
  }
}

Test中的代码:

public class Test {

    public void foo(){ 
      f();
    }
    public void f(){ 
      System.out.println("CflowTest.f();"); 
    }
}

Test1中的代码:

public class Test1 {
    public void foo1(Test test){ 
          test.f();
    } 
    public static void main(String[] args) {

        Test test=new Test();
        test.foo();
        System.out.println("**************************************");
        new Test1().foo1(test);  
    }
}

 

Test1中main函数的运行结果:

before call f()
com.gaojian.aspectj.test.Test@141d683
com.gaojian.aspectj.test.Test@141d683
CflowTest.f();
**************************************
before call f()
com.gaojian.aspectj.test.Test1@16a55fa
com.gaojian.aspectj.test.Test@141d683
CflowTest.f();

     

 

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

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

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

分享到:
评论

相关推荐

    AspectJ 文档

    在AspectJ中,可以声明的连接点包括方法调用、方法执行、构造器调用、构造器执行、字段获取、字段设置、初始化代码块、静态初始化代码块和异常处理器代码块等。 Pointcut是AspectJ中用于捕获一组特定连接点的表达式...

    Aspectj

    本指南将深入探讨AspectJ的核心概念、语法以及如何在实际项目中应用。 1. **面向切面编程(AOP)**: AOP是软件工程中的一种编程范式,旨在减少代码的冗余和提高可维护性。通过分离关注点,将横切关注点(如日志、异常...

    aspectj jar

    AspectJ和Spring的整合在Java开发中扮演着重要的角色,特别是在实现面向切面编程(AOP)时。AspectJ是一个强大的、成熟的库,它扩展了Java语言,允许开发者定义和执行切面,这是一种分离关注点的方式,使得业务逻辑...

    aspectJ

    【工具】AspectJ提供了一整套工具集,包括编译器ajc(AspectJ Compiler)和织入工具AJDT(AspectJ Development Tools),使得在Eclipse等IDE中无缝集成AOP变得可能。ajc可以将切面编译到字节码中,而AJDT则提供了...

    aspectj.pdf

    在AspectJ中,一个Java程序可以通过添加切面和通知来增强其行为。切面定义了何时何地插入代码,而通知则定义了插入的具体代码。通过这种方式,AspectJ允许开发者以一种更清晰、更解耦的方式处理横切关注点,如日志...

    AspectJ经典实例详解

    AspectJ是一种强大的面向切面编程(AOP)的Java扩展,它允许开发者在不修改原有代码的情况下,将关注点如日志...在提供的压缩包文件"AspectJ经典实例"中,应该包含了这些示例的详细代码和解释,可供进一步学习和参考。

    aspectj,aspectjrt,weaver等

    AspectJ、AspectJRT 和 AspectWeaver 是三个与面向切面编程(AOP)相关的关键组件,它们在Spring框架中有着重要应用,尤其对于初学者来说,理解这些概念是掌握Spring AOP的基础。 AspectJ 是一个强大的Java语言的...

    aspectj-1.6.9.jar

    4. **工具集**:AspectJ还提供了工具集,如`aspectjweaver.jar`(运行时织入所需的 weaving agent)和`ajdt`(Eclipse 插件,用于在IDE中支持AspectJ开发)。 5. **许可证**:`license.txt` 文件通常包含了软件的...

    spring和aspectj的aop实验

    标题"spring和aspectj的aop实验"表明我们将探讨如何在Spring中使用AspectJ进行AOP实践。这通常涉及到创建切面、定义通知、配置织入策略以及测试其效果。 1. **什么是AOP** AOP的核心概念是切面(Aspect),它封装...

    Aop之AspectJ详解解读demo

    在软件开发中,面向切面编程(AOP)是一种设计模式,它允许程序员将关注点分离到不同的模块,从而提高代码的可维护性和复用性。AspectJ是Java平台上的一个开源AOP框架,它提供了一种强大的语言级支持来实现切面。...

    book :aspectj in action

    3. 如何在Java项目中引入和使用AspectJ,包括静态和动态编织的区别。 4. 利用AspectJ进行日志记录、性能监控、事务管理和权限控制等实践案例。 5. 如何调试AspectJ代码,理解其编译过程和运行时行为。 6. 高级特性,...

    aspectj-1.9.6.jar

    使用AspectJ 1.9.6.jar时,开发者需要了解其配置方式,包括在Maven或Gradle构建系统中如何添加依赖,以及如何编写和编译AspectJ代码。此外,理解如何在IDE如Eclipse或IntelliJ IDEA中配置AspectJ支持,以便获得更好...

    JavaEE AspectJ基于注解的配置

    在Day01_AspectJAnno文件夹中,可能包含了关于如何配置和使用AspectJ注解的示例代码和练习,你可以通过查看这些代码加深理解。在学习过程中,实践是非常重要的,尝试自己创建不同的切面和通知,观察其在不同场景下的...

    精通AspectJ_源代码

    本资源包含的是《精通AspectJ》一书中的示例代码,通过这些代码,读者可以深入理解AspectJ的工作原理和实际应用。 在学习AspectJ时,有几个关键概念是必须掌握的: 1. **切面(Aspect)**:切面是AspectJ的核心,...

    aspectj开发包

    在实际应用中,AspectJ可以通过注解或XML配置来声明切面和通知。例如,下面是一个简单的AspectJ注解示例: ```java @Aspect public class LoggingAspect { @Before("execution(* com.example.service.*.*(..))") ...

    Aspect-Oriented Programming with AspectJ

    【Aspect-Oriented Programming with AspectJ】是一种编程范式,旨在解决传统面向对象编程中模块化问题,特别是在处理横切关注点(如日志、事务管理、安全性等)时的代码分散和重复。AspectJ是Java平台上的一个开源...

    spring源码导入所需aspectj包

    在Spring框架中,AspectJ是一种...通过以上步骤,你可以在Spring应用中成功地导入和使用AspectJ,实现更灵活、模块化的代码结构,提高代码复用性和可维护性。理解并熟练运用AOP是提升Spring应用开发能力的关键之一。

    动手写一个AspectJ的gradle插件

    总结来说,通过创建一个AspectJ的Gradle插件,我们可以便捷地将面向切面编程引入到项目中,实现代码的解耦和关注点分离。这个过程涉及Gradle插件的编写、AspectJ的使用以及如何在Gradle构建流程中集成这两个概念。这...

    AspectJ的JAR包

    在Spring AOP中使用AspectJ,你需要配置Spring容器来识别和处理切面。这通常涉及到以下步骤: 1. 添加依赖:在你的项目中,你需要包含上述两个JAR文件,并且在Spring配置文件中启用AspectJ自动代理。 2. 定义切面...

Global site tag (gtag.js) - Google Analytics