当前位置: 首页 > news >正文

MethodSignature signature = (MethodSignature) joinPoint.getSignature()

// 1. 使用 Signature(通用信息)
Signature signature1 = joinPoint.getSignature();
System.out.println("方法名:" + signature1.getName()); // 可用
System.out.println("所属类:" + signature1.getDeclaringTypeName()); // 可用
// System.out.println("返回值类型:" + signature1.getReturnType()); // 报错!Signature 没有该方法// 2. 使用 MethodSignature(方法特有信息)
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
System.out.println("方法名:" + signature.getName()); // 继承自 Signature
System.out.println("返回值类型:" + signature.getReturnType()); // 特有方法
System.out.println("参数类型:" + Arrays.toString(signature.getParameterTypes())); // 特有方法
Method method = signature.getMethod(); // 获取 Method 对象(可操作注解等)
  • 强制转换为 MethodSignature 时,必须确保连接点是方法执行(Spring AOP 中默认都是方法连接点),否则会抛出 ClassCastException
  • 在 Spring AOP 中,几乎所有场景都是方法连接点,因此实际开发中常用 MethodSignature 来获取更详细的方法信息。

  • Signature 是顶层接口,代表连接点的签名信息,适用于所有类型的连接点(如方法调用、构造方法、字段访问等)。
  • MethodSignature 是 Signature 的子接口,专门用于方法类型的连接点,仅在连接点是方法执行时有效。

2. 可获取的信息差异

Signature 接口提供通用的签名信息,而 MethodSignature 在此基础上增加了方法特有的信息

Signature 提供的信息(通用)MethodSignature 额外提供的信息(方法特有)
- 方法名(String getName()- 方法参数类型(Class<?>[] getParameterTypes()
- 所属类名(String getDeclaringTypeName()- 方法返回值类型(Class<?> getReturnType()
- 所属类(Class<?> getDeclaringType()- 方法对象(Method getMethod()

3. 使用场景

  • Signature signature1 = joinPoint.getSignature()适用于不确定连接点类型的场景(虽然 Spring AOP 主要处理方法,但理论上可能有其他类型连接点)。只能获取通用信息(如方法名、类名),无法直接获取方法参数类型、返回值类型等细节。

  • MethodSignature signature = (MethodSignature) joinPoint.getSignature()仅适用于方法类型的连接点(Spring AOP 中最常见的场景)。通过强制转换,可以获取方法特有的详细信息,例如:

    • 方法的参数类型(用于参数校验、日志打印等)
    • 方法的返回值类型(用于结果处理)
    • 直接获取 Method 对象(可反射调用、获取注解等)

@Component
@Aspect //告诉Spring这个组件是个切面。
public class LogAspect {@Pointcut("execution(int com.atguigu.spring.aop.calculator.MathCalculator.*(..))")public void pointCut(){};@Before("pointCut()")public void logStart(JoinPoint joinPoint){//1、拿到方法全签名MethodSignature signature = (MethodSignature) joinPoint.getSignature();//方法名String name = signature.getName();//目标方法传来的参数值Object[] args = joinPoint.getArgs();System.out.println("【切面 - 日志】【"+name+"】开始:参数列表:【"+ Arrays.toString(args) +"】");}@After("pointCut()")public void logEnd(JoinPoint joinPoint){MethodSignature signature = (MethodSignature) joinPoint.getSignature();String name = signature.getName();System.out.println("【切面 - 日志】【"+name+"】后置...");}@AfterReturning(value = "pointCut()",returning = "result") //returning="result" 获取目标方法返回值public void logReturn(JoinPoint joinPoint,Object result){MethodSignature signature = (MethodSignature) joinPoint.getSignature();String name = signature.getName();System.out.println("【切面 - 日志】【"+name+"】返回:值:"+result);}@AfterThrowing(value = "pointCut()",throwing = "e" //throwing="e" 获取目标方法抛出的异常)public void logException(JoinPoint joinPoint,Throwable e){MethodSignature signature = (MethodSignature) joinPoint.getSignature();String name = signature.getName();System.out.println("【切面 - 日志】【"+name+"】异常:错误信息:【"+e.getMessage()+"】");}//参数带什么就切
//    @Before("args(int,int)")public void haha(){System.out.println("【切面 - 日志】哈哈哈...");}//参数上有没有标注注解
//    @Before("@args(com.atguigu.spring.aop.annotation.MyAn) && within(com.atguigu.spring.aop.service.UserService)")public void hehehe(){System.out.println("【切面 - 日志】呵呵呵...");}//方法上
//    @Before("@annotation(com.atguigu.spring.aop.annotation.MyAn)")public void test(){System.out.println("【切面 - 日志】MyAn测试...");}}

http://www.dtcms.com/a/391119.html

相关文章:

  • CN2香港服务器是否适合SEO优化?
  • 查看电脑IP地址、修改IP操作,查询本地网络使用的公网IP,判断路由器是否有公网IP,内网IP又怎么让外网上访问
  • 合成孔径雷达干涉测量InSAR:从星载与地基系统原理到多领域应用实战,涵盖数据处理、地形三维重建、形变监测与案例解析
  • Activity 之间跳转时,生命周期的变化
  • SortableItem拖拽组件里的Popconfirm失效
  • [吾爱原创] 图片尺寸调整-支持批量、多格式、缩小、放大、保留元数据、无损质量、最小体积、预览
  • 【C语言】C 语言文件操作全解析:从基础到进阶
  • 《工作流落地篇:工作流中涉及到的主要数据库表》
  • 实验二理解 Java 语言的基本结构和程序设计方法
  • 【开题答辩全过程】以 基于Java的社区医疗预约系统的设计与实现为例,包含答辩的问题和答案
  • 以虚筑实,虚拟仿真技术浇筑水利工程人才培养的数字基座
  • 拟声 0.79.1 | 高颜值,拟态风格,B站歌曲,可下载,可搜索歌词
  • 团体程序设计天梯赛-练习集 L1-038 新世界
  • 【MySQL】约束类型
  • AXI4 DDR读写测试
  • 一个.h .hpp 笔记
  • MongoDB数据类型学习笔记
  • STM32实现USB的CDC+MSC+AUDIO的USB复合设备
  • x265静态编译win10--
  • STM32学习-Keli仿真
  • LeetCode hot 100 解题思路记录(一)
  • 01-搭建后端django项目
  • 深入探索卷积神经网络:从基础到高级架构(一)
  • 【大数据社科交叉方向会议】第六届大数据与社会科学国际学术会议(ICBDSS 2025)
  • 计算机网络 知识点梳理及讲解(二)物理层:编码调制、传输媒体、信道复用、宽带接入等
  • 学习嵌入式的第三十八天——ARM——概述
  • 初级会计【备考】
  • Windows系统忘记用户名密码怎么办
  • 市场部绩效考核关键指标与市场分析
  • 嵌入式 - ARM8