有时需要获得原始方法的数据进行相应的操作。
获取 原始参数
JoinPoint:适用于前置、后置、返回后、抛出异常的通知
public void before(JoinPoint jp) {
Object[] args = jp.getArgs();
System.out.println(Arrays.toString(args));
System.out.println("before advice ..." );
}
ProceedingJoinPoint:适用于环绕通知。ProceedingJoinPoint继承了JoinPoint
@Around("pt()")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
Object[] args = pjp.getArgs();
System.out.println(Arrays.toString(args));
//获取参数并修改参数
args[0] = 666;
Object ret = pjp.proceed(args);
return ret;
}
获取 返回值
使用 returning = "ret",表示返回值保存在ret中。
(JoinPoint jp, Object ret)参数顺序不能反
适用于:环绕通知、返回后通知
@AfterReturning(value = "pt()", returning = "ret")
public void afterReturning(JoinPoint jp, Object ret) {
System.out.println("afterReturning advice ..." + ret);
}
获取 异常
- 环绕通知
使用try...catch...
@Around("pt()")
public Object around(ProceedingJoinPoint pjp) {
Object[] args = pjp.getArgs();
System.out.println(Arrays.toString(args));
args[0] = 666;
Object ret = null;
try {
ret = pjp.proceed(args);
} catch (Throwable t) {
t.printStackTrace();
}
return ret;
}
- 抛出异常后通知
throwing属性值必须与方法形参名相同
@AfterThrowing(value = "pt()", throwing = "t")
public void afterThrowing(Throwable t) {
System.out.println("afterThrowing advice ..."+t);
}