AspectJ 使用 org.aspectj.lang.JoinPoint 接口表示目标类连接点对象,如果是环绕增强,则使用 org.aspectj.lang.ProceedingJoinPoint 表示连接点对象,ProceedingJoinPoint 类是 JoinPoint 的子接口。

(1) JoinPoint 接口的主要方法:

  • java.lang.Object[] getArgs():获取连接点方法运行时的入参列表;
  • Signature getSignature():获取连接点的方法签名对象;
  • java.lang.Object getTarget():获取连接点所在的目标对象;
  • java.lang.Object getThis():获取代理对象本身;

(2) ProceedingJoinPoint:

除了继承上述四个方法外,还新增了两个:

  • java.lang.Object proceed() throws java.lang.Throwable:通过反射执行目标对象的连接点处的方法;
  • java.lang.Object proceed(java.lang.Object[] args) throws java.lang.Throwable:通过反射执行目标对象的连接点处的方法,不过使用新的入参替换原来的入参。

下面通过具体的实例来看一下每个方法的用法。

这里我们采用JDK代理的方式,首先定义一个接口,

package com.dz.demo.aspect;/*** Created by dzwang on 2019/3/6.*/
public interface Humanity {void speckTo(String name, String words);void walkTo(String place);
}

它的实现类为:

package com.dz.demo.aspect;/*** Created by dzwang on 2019/3/6.*/
public class Man implements Humanity {public void speckTo(String name, String words) {System.out.println("speckTo " + name + ": " + words);}public void walkTo(String place) {System.out.println("walkTo " + place);}
}

基础工作完成好了之后,我们实现一个切面,增强方法的第一个入参声明为  org.aspectj.lang.ProceedingJoinPoint 类型:

package com.dz.demo.aspect;import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;/*** Created by dzwang on 2019/3/6.*/
@Aspect
public class TestAspect {@Around("execution(* speckTo(..)) && target(com.dz.demo.aspect.Man)")public void testJoinPoint(ProceedingJoinPoint pjp) throws Throwable {System.out.println("****testJoinPoint start****");System.out.println("getArgs():" + pjp.getArgs());System.out.println("Arg0:" + pjp.getArgs()[0]);System.out.println("getSignature():" + pjp.getSignature().getName());System.out.println("getTarget():" + pjp.getTarget().getClass());System.out.println("getThis():" + pjp.getThis().toString());pjp.proceed();System.out.println("****testJoinPoint end****");}
}

定义好 spring 配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-4.0.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-4.0.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-4.0.xsd"><context:component-scan base-package="com.dz.demo.aspect"></context:component-scan><aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy><bean id="man" class="com.dz.demo.aspect.Man"></bean><bean class="com.dz.demo.aspect.TestAspect"></bean></beans>

最后,写测试方法来看看 JoinPoint 类中各个方法的具体用途:

package com.dz.demo.aspect;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;/*** Created by dzwang on 2019/3/6.*/
public class StartDemo {public static void main(String[] args) {String configPath = "classpath:beans.xml";ApplicationContext context = new ClassPathXmlApplicationContext(configPath);Humanity man = (Humanity) context.getBean("man");man.speckTo("Dennis", "Hello");man.walkTo("Company");}
}

输出结果如下:

****testJoinPoint start****
getArgs():[Ljava.lang.Object;@4c178a76
Arg0:Dennis
getSignature():speckTo
getTarget():class com.dz.demo.aspect.Man
getThis():com.dz.demo.aspect.Man@4988d8b8
speckTo Dennis: Hello
****testJoinPoint end****
walkTo Company

AspectJ中的org.aspectj.lang.JoinPoint接口的主要方法及使用相关推荐

  1. AspectJ中的JoinPoint方法概要

    AspectJ中的切入点匹配的执行点称作连接的(Join Point),在通知方法中可以声明一个JoinPoint类型的参数.通过JoinPoint可以访问连接点的细节.下面简要介绍JponPoint ...

  2. NoClassDefFoundError: org/aspectj/lang/JoinPoint

    NoClassDefFoundError: org/aspectj/lang/JoinPoint 控制台输出: org.springframework.beans.factory.BeanCreati ...

  3. AspectJ中JoinPoint和ProceedingJoinPoint注解的使用

    概念 Joint Point JointPoint是程序运行过程中可识别的点,这个点可以用来作为AOP切入点.JointPoint对象则包含了和切入相关的很多信息.比如切入点的对象,方法,属性等.我们 ...

  4. @AspectJ中的几种通知方式详解

    本文来详细说下@AspectJ中的几种通知方式 文章目录 概述 通知方式说明 一个例子 本文小结 概述 当Spring 2.0发布以后,Spring AOP增加了新的使用方式,Spring AOP集成 ...

  5. AOP编程过程中的JoinPoint接口

    在AOP编程过程中需要使用到的一个 JoinPoint 接口,用来获取调用的信息,下面是这个接口的代码 // // Source code recreated from a .class file b ...

  6. @AspectJ中的切点表达式详解

    本文来说下@AspectJ中的切点表达式 文章目录 概述 概述

  7. SpringBoot中使用AOP打印接口日志的方法(转载)

    前言 AOP 是 Aspect Oriented Program (面向切面)的编程的缩写.他是和面向对象编程相对的一个概念.在面向对象的编程中,我们倾向于采用封装.继承.多态等概念,将一个个的功能在 ...

  8. SpringAop中JoinPoint对象的使用方法

    JoinPoint的用法 JoinPoint 对象 JoinPoint对象封装了SpringAop中切面方法的信息,在切面方法中添加JoinPoint参数,就可以获取到封装了该方法信息的JoinPoi ...

  9. c# typescript_在任何IDE中从C#,Java或Python代码获取TypeScript接口的简单方法

    c# typescript by Leonardo Carreiro 莱昂纳多·卡雷罗(Leonardo Carreiro) 在任何IDE中从C#,Java或Python代码获取TypeScript接 ...

最新文章

  1. iOS App上架流程(2016详细版)
  2. 关于字符串计算size的方法比较
  3. Spring入门详细教程(三)
  4. C++ 可以把变量当成函数用~~
  5. TP框架笔记 -- 394-model的创建
  6. MongoDB 命令速查表
  7. 【大牛疯狂教学】mysqlinnodb和myisam
  8. Python自动化开发01
  9. heartbeat与keepalived对比
  10. 解决Dev c++不能调试问题
  11. 关于js的一切(updating...)
  12. docker安装常用组件(mysql,redis,postgres,rancher,Portainer,蝉道,JIRA,sonarqube,Confluence,pgadmin4,harbor)
  13. (PC+WAP)高等院校学院职业学校类网站源码 政府单位机构协会Pbootcms网站模板
  14. CPU、核心数、线程数、运行内存、超线程理解
  15. Unity shader 空气扭曲效果
  16. 一加 Ace2是直屏还是曲面屏 一加 Ace2有IP68级防水吗
  17. sbrkr.c:(.text._sbrk_r+0xc): undefined reference to `_sbrk'
  18. 13 个 Mongodb GUI 可视化管理工具,总有一款适合你
  19. Unmatched braces in the pattern
  20. 质谱和蛋白质组学领域简述

热门文章

  1. Xcode11 新建纯代码项目以及运行模拟器黑屏解决
  2. 击败三星或成iPhone最大供应商,京东方要带国产屏冲刺全球第一?
  3. 网上商城——邮件发送(一)
  4. 深度 Deepin Linux 不能进入控制中心,不能关机、重启、待机、休眠、锁定、注销的解决方法
  5. oracle 日期转时间戳
  6. Ubuntu16.04 更新后搜狗输入法不能用
  7. 【备战秋招】每日一题:2022年清华大学(深圳)保研夏令营机试题-第一题-树上计数
  8. Activiti工作流浅析
  9. 迁移学习——Fine-tune
  10. Hadoop3.x live node 为0或1 所有出现的情况 以及 解决办法