ProceedingJoinPoint pjp这个参数有什么用
时间: 2023-11-09 21:58:58 浏览: 163
ProceedingJoinPoint是AOP框架中用于获取被代理方法信息的接口,它可以用来控制方法的执行流程,包括调用被代理方法、获取方法参数、修改方法参数等等。在切面类中,我们通常将ProceedingJoinPoint作为方法参数来获取被代理方法的相关信息。
具体来说,ProceedingJoinPoint接口中提供了以下方法:
- Object[] getArgs():获取被代理方法的参数列表。
- Signature getSignature():获取被代理方法的签名,包括方法名、修饰符、返回类型等等。
- Object getTarget():获取被代理对象。
- Object proceed():调用被代理方法并获取返回值。
- Object proceed(Object[] args):使用指定的参数调用被代理方法并获取返回值。
在切面类中,我们可以根据需要使用这些方法来获取被代理方法的信息,并在执行过程中对方法进行控制和增强。比如,在前置通知中可以输出方法名和参数列表,在后置通知中可以获取方法返回值并进行处理,在异常通知中可以捕获方法抛出的异常并进行处理,在最终通知中可以执行一些清理操作等等。
相关问题
@Around("pointCutIAntiResubmit(iAntiResubmit)") public Object aroundAdvice(ProceedingJoinPoint pjp, IAntiResubmit iAntiResubmit) { String key = loadKey(iAntiResubmit.key(), pjp); String redisKey = RedisConstants.ANTI_RESUBMIT_REDIS_KEY + RedisConstants.SEPARATOR + getValue(pjp, iAntiResubmit) + "::" + key; RLock lock = redissonClient.getLock(redisKey); try { Object[] args = pjp.getArgs();// 得到方法执行所需的参数 lock.lock(); return pjp.proceed(args);// 明确调用切入点方法(切入点方法) } catch (SysException se) { throw se; } catch (Throwable e) { throw new SysException(e.getMessage()); } finally { lock.unlock(); } }这里的iAntiResubmit.key()是不是为空
如果IAntiResubmit注解被正确地使用,并且在使用该注解时为key成员变量显式地赋值,那么iAntiResubmit.key()应该是非空的。
在上面的代码中,通过iAntiResubmit.key()获取IAntiResubmit注解的key成员变量的值,并将其作为loadKey方法的第一个参数。如果IAntiResubmit注解的key成员变量没有显式地赋值,那么iAntiResubmit.key()将返回空字符串,但是在loadKey方法中,空字符串会被视为无效的key值,可能会导致程序出错。
因此,在使用IAntiResubmit注解时,应该为其key成员变量显式地赋值,以确保程序能够正确地执行。
ProceedingJoinPoint 获取请求参数
根据提供的引用内容,可以看出ProceedingJoinPoint对象是专门用于环绕通知的,可以实现对原始方法的调用。在环绕通知中,可以通过ProceedingJoinPoint对象的getArgs()方法获取到原始方法的调用参数。下面是一个获取请求参数的例子:
```java
@Around("pt()")
public Object around(ProceedingJoinPoint pjp) {
System.out.println("around before advice 参数...");
Object[] args = pjp.getArgs(); // 获取请求参数
System.out.println(Arrays.toString(args));
Object ret = null;
try {
ret = pjp.proceed(args);
} catch (Throwable t) {
t.printStackTrace();
}
System.out.println("around after advice...");
return ret;
}
```
在上面的例子中,通过调用ProceedingJoinPoint对象的getArgs()方法获取到了原始方法的调用参数,并将其打印输出。需要注意的是,getArgs()方法返回的是一个Object数组,需要使用Arrays.toString()方法将其转换为字符串才能打印输出。
阅读全文