spring 切面編程中獲取具體方法的方法
工作中,使用環繞通知,用來捕獲異常,然后通過獲取方法的返回值,返回不同的數據給到調用方。
由於方法的返回值不同,我們處理異常時,也需要返回不同的格式。
這時,就需要獲取具體方法了的返回值了。
我的環繞通知方法如下:
@Around(value = "GlobalControllerAspect.controllerPointcut()") public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { Object result = null; try { long statrTime=System.currentTimeMillis(); result = proceedingJoinPoint.proceed(); long endTime=System.currentTimeMillis(); String declaringTypeName = proceedingJoinPoint.getSignature().getDeclaringTypeName(); String methodName = proceedingJoinPoint.getSignature().getName(); StringBuilder spendTimeLog=new StringBuilder("方法名稱:").append(declaringTypeName).append(".").append(methodName).append("() 耗時為:").append(endTime-statrTime).append("ms."); logger.info(spendTimeLog.toString()); } catch (Exception e) { logger.error("環繞通知捕獲異常信息:",e); ResponseModel responseModel=new ResponseModel(); if (e instanceof RuntimeException) { responseModel.setStatus(ResponseModel.STATUS_FAIL); responseModel.setMsgType(ResponseModel.MSGTYPE_INFO); responseModel.setMsgContent(e.getMessage()); } else { responseModel.setMsgType(ResponseModel.MSGTYPE_WARINNING); responseModel.setStatus(ResponseModel.STATUS_ERROR); responseModel.setMsgContent(e.getMessage()); } Signature sig = proceedingJoinPoint.getSignature(); MethodSignature msig = null; if (!(sig instanceof MethodSignature)) { throw new IllegalArgumentException("該注解只能用於方法"); } msig = (MethodSignature) sig; Object target = proceedingJoinPoint.getTarget(); Method currentMethod = target.getClass().getMethod(msig.getName(), msig.getParameterTypes()); Class<?> returnType = currentMethod.getReturnType(); if(returnType.isAssignableFrom(responseModel.getClass())||returnType==ResponseModel.class){ return responseModel; }else if(returnType==JSONObject.class){ return responseModel.toJSON(); } } return result; }
獲取具體方法的代碼:
Signature sig = proceedingJoinPoint.getSignature(); MethodSignature msig = null; if (!(sig instanceof MethodSignature)) { throw new IllegalArgumentException("該注解只能用於方法"); } msig = (MethodSignature) sig; Object target = proceedingJoinPoint.getTarget(); Method currentMethod = target.getClass().getMethod(msig.getName(), msig.getParameterTypes()); Class<?> returnType = currentMethod.getReturnType();
獲取到具體方法,返回值就很容易獲取了。