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

    获取到具体方法,返回值就很容易获取了。

  • 相关阅读:
    两分钟看完一道投机取巧的算法题
    浅谈什么是递归算法
    浅谈什么是图拓扑排序
    what ?1 + 2 + 3 + ⋯ + ∞ = 1/12 ?
    浅谈什么是分治算法
    有点难度,几道和「滑动窗口」有关的算法面试题
    LeetCode 第 2 号问题:两数相加
    面试官,我会写二分查找法!对,没有 bug 的那种!
    基础复习——通过SQLite优化记住密码功能
    基础复习——内容共享——通过ContentProvider封装数据——通过ContentResolver访问数据
  • 原文地址:https://www.cnblogs.com/sloveling/p/spring_aop.html
Copyright © 2020-2023  润新知