spring aop 切面編程中獲取具體方法的方法


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();

獲取到具體方法,返回值就很容易獲取了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM