joinPoint的用法

部署运行你感兴趣的模型镜像

https://blog.youkuaiyun.com/qq_15037231/article/details/80624064

您可能感兴趣的与本文相关的镜像

Python3.11

Python3.11

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

在 Spring AOP 中,`JoinPoint` 是一个非常关键的接口,用于获取当前切面所拦截的方法的运行时信息。通过 `JoinPoint` 可以获取目标方法的名称、参数、返回值等元数据,这对于日志记录、权限控制等通用逻辑非常有用。 ### 获取方法名称 可以通过 `JoinPoint` 的 `getSignature()` 方法获取方法签名对象,再通过 `getName()` 获取方法名称。例如: ```java @Before("execution(public void com.journaldev.spring.model..set*(*))") public void loggingAdvice(JoinPoint joinPoint) { String methodName = joinPoint.getSignature().getName(); System.out.println("Before running loggingAdvice on method=" + methodName); } ``` 该方式可以准确获取当前被拦截方法的名称,适用于大多数 Spring AOP 场景[^1]。 ### 获取方法参数值 通过 `JoinPoint` 的 `getArgs()` 方法可以获得当前方法调用时传入的参数数组。例如: ```java @Before("execution(public void com.journaldev.spring.model..set*(*))") public void loggingAdvice(JoinPoint joinPoint) { Object[] args = joinPoint.getArgs(); System.out.println("Arguments Passed=" + Arrays.toString(args)); } ``` 此方式返回的是一个 `Object[]` 数组,数组中的每个元素对应方法调用时的实际参数值。若需要获取特定类型的参数值,可以通过类型判断或直接使用 `@Before("args(name)")` 的方式绑定参数。 ### 获取方法参数名称 获取方法参数名称较为复杂,因为 Java 编译后的 `.class` 文件默认不保留参数名称信息。如果需要通过 `JoinPoint` 获取参数名称,通常需要结合以下几种方式: 1. **使用 Spring 的 `LocalVariableTableParameterNameDiscoverer`** 该类可以通过分析字节码局部变量表获取参数名称,但要求类文件中包含调试信息(即编译时使用 `-g` 选项): ```java Method method = ((MethodSignature) joinPoint.getSignature()).getMethod(); LocalVariableTableParameterNameDiscoverer discoverer = new LocalVariableTableParameterNameDiscoverer(); String[] parameterNames = discoverer.getParameterNames(method); ``` 2. **使用 Java 8 及以上版本的反射 API** 如果编译时添加了 `-parameters` 参数,则可以直接通过反射获取参数名称: ```java Method method = ((MethodSignature) joinPoint.getSignature()).getMethod(); Parameter[] parameters = method.getParameters(); for (Parameter parameter : parameters) { System.out.println("Parameter name: " + parameter.getName()); } ``` ### 获取目标对象和代理对象 除了方法信息外,`JoinPoint` 还可以获取目标对象和代理对象: - `getTarget()`:返回被代理的目标对象。 - `getThis()`:返回当前代理对象。 这些信息在需要对目标对象进行额外操作时非常有用。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值