转自链接点击打开链接
AspectJ使用org.aspectj.lang.JoinPoint接口表示目标类连接点对象,如果是环绕增强时,使用org.aspectj.lang.ProceedingJoinPoint表示连接点对象,该类是JoinPoint的子接口。任何一个增强方法都可以通过将第一个入参声明为JoinPoint访问到连接点上下文的信息。我们先来了解一下这两个接口的主要方法:
1)JoinPoint
java.lang.Object[] getArgs():获取连接点方法运行时的入参列表;
Signature getSignature() :获取连接点的方法签名对象;
java.lang.Object getTarget() :获取连接点所在的目标对象;
java.lang.Object getThis() :获取代理对象本身;
2)ProceedingJoinPoint
ProceedingJoinPoint继承JoinPoint子接口,它新增了两个用于执行连接点方法的方法:
java.lang.Object proceed() throws java.lang.Throwable:通过反射执行目标对象的连接点处的方法;
java.lang.Object proceed(java.lang.Object[] args) throws java.lang.Throwable:通过反射执行目标对象连接点处的方法,不过使用新的入参替换原来的入参。
/** * 记录调用的类和方法 * @param point 切入点信息 */ private void logClassAndMethod(ProceedingJoinPoint point) { Class clz = point.getTarget().getClass(); //调用的类 String methodName = point.getSignature().getName(); //调用的方法名 logger.info("around [{}].[{}]", clz, methodName); }
/** * 记录调用信息 */ private void logCallingInfo(ProceedingJoinPoint point) { logClassAndMethod(point); logArgs(point.getArgs()); } private void logArgs(Object[] args) { /* 获得参数个数 */ int argsLength = (args == null) ? 0 : args.length; if (argsLength > 0) { for (int i = 0; i < argsLength; i++) { logger.info("arg[{}]: {}", i, args[i]); } } }private void checkParameters(Object[] args) throws ParameterException { /* 获得参数个数 */ int argsLength = (args == null) ? 0 : args.length; if (argsLength > 0) { for (int i = 0; i < argsLength; i++) { /* 对可校验请求,进行校验,如果失败,直接返回参数错误信息 */ if (args[i] instanceof CheckableParameter) { ((CheckableParameter) args[i]).check(); } } } }