【AOP】通知获取数据

65 阅读1分钟

有时需要获得原始方法的数据进行相应的操作。

获取 原始参数

  • 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);
}