修改getargs()数组本身不会生效,因为返回的是参数副本引用;必须通过pjp.proceed(newargs)显式传入新参数数组才能使修改生效。

不会直接生效。
为什么修改 getArgs() 数组本身没用
调用 pjp.getArgs() 返回的是一个 Object[],但它只是目标方法参数的副本引用。直接修改这个数组元素(比如 args[0] = newValue)不会自动同步到目标方法实际接收的参数上。
这是因为 Spring AOP 在执行目标方法时,并不读取你改过的这个数组,而是使用原始传入的参数值或你显式传递给 proceed() 的参数。
真正生效的方式:必须用 proceed(Object[] args)
要让参数修改起作用,必须在调用 pjp.proceed() 时,把新构造或修改后的参数数组作为参数传进去:
- pjp.proceed(newArgs) → 目标方法收到的是 newArgs 中的值
- pjp.proceed()(无参)→ 使用原始参数,你对 getArgs() 的修改被忽略
例如:你想把第一个参数 User 对象的 id 改为 123,得这样写:
Object[] args = pjp.getArgs();
if (args.length > 0 && args[0] instanceof User) {
User user = (User) args[0];
user.setId(123L); // 修改对象属性(如果目标方法用的是引用,会生效)
}
// ✅ 关键:显式传入 args(即使没新建数组,也要这样调用)
Object result = pjp.proceed(args);
两种修改路径的实际效果
修改对象属性(推荐):如果参数是引用类型(如 User、Map),且目标方法内部会读取该对象状态,那么直接改 user.setName("xxx") 是有效的——因为对象本身被共享。
替换整个参数(更彻底):创建全新参数数组,比如 new Object[]{new User("xxx"), "other"},再调用 pjp.proceed(newArgs),能完全控制传入值,适用于不可变对象或需要彻底替换的场景。
常见误区提醒
- 只改 args[0] = ... 却调用 pjp.proceed()(无参)→ 修改丢失
- 误以为 getArgs() 返回的是“活链接”→ 实际是快照,不驱动执行
- 对基本类型参数(int、boolean)试图修改数组元素→ 无效,必须走 proceed(newArgs)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











