对于 @Before, @After, @AfterReturning, @AfterThrowing 四种通知来说,在通知方法中加上一个类型为 JoinPoint 的参数,调用其中的 getArgs() 方法即可获取调用原始方法的参数,返回类型是 Object[] 数组
对于 @Around 通知,有 ProceedingJoinPoint 作为参数,而 ProceedingJoinPoint 继承了 JoinPoint 接口,所以可以直接调用 getArgs() 方法获取参数
// After, AfterReturning, AfterThrowing 用法与 Before 相同
@Before("pt()")
public void before(JoinPoint jp) {
Object[] args = jp.getArgs();
System.out.println("args: " + Arrays.toString(args));
}
@Around("pt()")
public void around(ProceedingJoinPoint pjp) throws Throwable {
Object[] args = pjp.getArgs();
System.out.println("args: " + Arrays.toString(args));
pjp.proceed();
// args[0] = -1;
// pjp.proceed(args);
}
[补充]
只有 Around 和 AfterReturning 两种通知能够获取返回值。
After 通知虽然在切入点执行之后,但即使原始方法执行出错,未能正确返回,也依然会执行 After 通知,所以不能保证存在返回值
Around 通知中,调用 proceed() 方法时用变量接收返回值即可
AfterReturning 通知要在注解中加入 returning = ”ret“, 并在通知方法中将 ret 作为参数传入(ret 是参数名称,可以自行修改)
@Around("pt()")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
Object ret = pjp.proceed();
System.out.println("returning = " + ret);
return ret;
}
@AfterReturning(value = "pt()", returning = "ret")
public void afterReturning(JoinPoint jp, Object ret) {
System.out.println("returning: " + ret);
}
[注意]
Around 和 AfterThrowing 两种通知能够获取原始方法抛出的异常。
Around 通知中,调用 proceed() 方法时用 try/catch 语句包裹即可捕获原始方法异常
AfterThrowing 通知获取异常的操作类似于 AfterReturning 通知获取返回值,在注解中加入 throwing = “throwing”,再将 throwing 作为参数传入通知方法
@Around("pt()")
public Object around(ProceedingJoinPoint pjp) {
Object ret = null;
try {
ret = pjp.proceed();
} catch (Throwable throwable) {
throwable.printStackTrace();
}
return ret;
}
@AfterThrowing(value = "pt()", throwing = "throwing")
public void afterThrowing(JoinPoint jp, Throwable throwing) {
throwing.printStackTrace();
}
[注意]