AspectJ中的org.aspectj.lang.JoinPoint接口的主要方法及使用
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接口的主要方法及使用相关推荐
- AspectJ中的JoinPoint方法概要
AspectJ中的切入点匹配的执行点称作连接的(Join Point),在通知方法中可以声明一个JoinPoint类型的参数.通过JoinPoint可以访问连接点的细节.下面简要介绍JponPoint ...
- NoClassDefFoundError: org/aspectj/lang/JoinPoint
NoClassDefFoundError: org/aspectj/lang/JoinPoint 控制台输出: org.springframework.beans.factory.BeanCreati ...
- AspectJ中JoinPoint和ProceedingJoinPoint注解的使用
概念 Joint Point JointPoint是程序运行过程中可识别的点,这个点可以用来作为AOP切入点.JointPoint对象则包含了和切入相关的很多信息.比如切入点的对象,方法,属性等.我们 ...
- @AspectJ中的几种通知方式详解
本文来详细说下@AspectJ中的几种通知方式 文章目录 概述 通知方式说明 一个例子 本文小结 概述 当Spring 2.0发布以后,Spring AOP增加了新的使用方式,Spring AOP集成 ...
- AOP编程过程中的JoinPoint接口
在AOP编程过程中需要使用到的一个 JoinPoint 接口,用来获取调用的信息,下面是这个接口的代码 // // Source code recreated from a .class file b ...
- @AspectJ中的切点表达式详解
本文来说下@AspectJ中的切点表达式 文章目录 概述 概述
- SpringBoot中使用AOP打印接口日志的方法(转载)
前言 AOP 是 Aspect Oriented Program (面向切面)的编程的缩写.他是和面向对象编程相对的一个概念.在面向对象的编程中,我们倾向于采用封装.继承.多态等概念,将一个个的功能在 ...
- SpringAop中JoinPoint对象的使用方法
JoinPoint的用法 JoinPoint 对象 JoinPoint对象封装了SpringAop中切面方法的信息,在切面方法中添加JoinPoint参数,就可以获取到封装了该方法信息的JoinPoi ...
- c# typescript_在任何IDE中从C#,Java或Python代码获取TypeScript接口的简单方法
c# typescript by Leonardo Carreiro 莱昂纳多·卡雷罗(Leonardo Carreiro) 在任何IDE中从C#,Java或Python代码获取TypeScript接 ...
最新文章
- iOS App上架流程(2016详细版)
- 关于字符串计算size的方法比较
- Spring入门详细教程(三)
- C++ 可以把变量当成函数用~~
- TP框架笔记 -- 394-model的创建
- MongoDB 命令速查表
- 【大牛疯狂教学】mysqlinnodb和myisam
- Python自动化开发01
- heartbeat与keepalived对比
- 解决Dev c++不能调试问题
- 关于js的一切(updating...)
- docker安装常用组件(mysql,redis,postgres,rancher,Portainer,蝉道,JIRA,sonarqube,Confluence,pgadmin4,harbor)
- (PC+WAP)高等院校学院职业学校类网站源码 政府单位机构协会Pbootcms网站模板
- CPU、核心数、线程数、运行内存、超线程理解
- Unity shader 空气扭曲效果
- 一加 Ace2是直屏还是曲面屏 一加 Ace2有IP68级防水吗
- sbrkr.c:(.text._sbrk_r+0xc): undefined reference to `_sbrk'
- 13 个 Mongodb GUI 可视化管理工具,总有一款适合你
- Unmatched braces in the pattern
- 质谱和蛋白质组学领域简述
热门文章
- Xcode11 新建纯代码项目以及运行模拟器黑屏解决
- 击败三星或成iPhone最大供应商,京东方要带国产屏冲刺全球第一?
- 网上商城——邮件发送(一)
- 深度 Deepin Linux 不能进入控制中心,不能关机、重启、待机、休眠、锁定、注销的解决方法
- oracle 日期转时间戳
- Ubuntu16.04 更新后搜狗输入法不能用
- 【备战秋招】每日一题:2022年清华大学(深圳)保研夏令营机试题-第一题-树上计数
- Activiti工作流浅析
- 迁移学习——Fine-tune
- Hadoop3.x live node 为0或1 所有出现的情况 以及 解决办法