JoinPoint.getArgs()返回的参数数组是否始终遵循方法签名顺序?
关于ProceedingJoinPoint.getArgs()参数顺序的问题
绝对是的,返回的数组会严格按照目标方法签名的参数顺序排列,你实际测试的结果完全符合规范,这个行为是可以放心依赖的。
为什么这么肯定?原因很简单:
- Spring AOP(包括它底层参考的AspectJ规范)在处理方法切面时,是直接基于目标方法的反射元数据来获取参数的。Java反射里的
Method.getParameters()本身就会严格按照方法定义时的参数顺序返回信息,AOP框架只是把实际调用时的参数值按这个既定顺序打包成数组返回给你。 - 不管是普通方法、重载方法,还是带有不同修饰符的参数,只要你的切面正确匹配到了目标方法,
getArgs()的数组索引就和方法签名里的参数位置一一对应:args[0]一定对应myString(方法的第一个参数)args[1]一定对应myInteger(方法的第二个参数)args[2]一定对应myObject(方法的第三个参数)
这里有个小细节需要注意:如果你的项目编译时没有开启-parameters选项(旧版Java默认不开启),虽然参数顺序不受影响,但如果想通过参数名称来获取参数的话会遇到问题——但这和参数顺序完全无关,顺序依然是可靠的。
举个实际使用的例子,如果你想在切面里修改某个参数的值,直接通过索引定位就没问题:
// 把第二个参数(Integer类型)改成100 args[1] = 100; // 用修改后的参数继续执行目标方法 proceedingJoinPoint.proceed(args);
这样目标方法接收到的myInteger就会是100,完全符合预期。
内容的提问来源于stack exchange,提问作者Jimmy
相关产品推荐
相关产品推荐

