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

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

spring aop 切面编程中获取具体方法的方法的更多相关文章

  1. Spring AOP 切面编程记录日志和接口执行时间

    最近客户现在提出系统访问非常慢,需要优化提升访问速度,在排查了nginx.tomcat内存和服务器负载之后,判断是数据库查询速度慢,进一步排查发现是因为部分视图和表查询特别慢导致了整个系统的响应时间特 ...

  2. Java编程中获取键盘输入实现方法及注意事项

    Java编程中获取键盘输入实现方法及注意事项 1. 键盘输入一个数组 package com.wen201807.sort; import java.util.Scanner; public clas ...

  3. Spring AOP 切面编程的方法

    spring aop的使用分为两种,一种是使用注解来实现,一种是使用配置文件来实现. 先来简单的介绍一下这两种方法的实现,接下来详细的介绍各处的知识点便于查阅.目录如下: 1.基于注解实现spring ...

  4. Spring AOP 切面编程实战Demo项目

    为什么会有此项目?在某日,我看博客时,看到了讲面向切面编程的内容,之前也知道spring是面向切面编程的,只是自己没有写过相关的代码,于是决定自己写一个test.但是url拦截器从外部看,和AOP有相 ...

  5. spring aop切面编程实现操作日志步骤

    1.在spring-mvc.xml配置文件中打开切面开关: <aop:aspectj-autoproxy proxy-target-class="true"/> 注意: ...

  6. spring aop 切面编程

    import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Ha ...

  7. 快速高效掌握企业级项目中的Spring面向切面编程应用,外带讲面试技巧

    Spring面向切面编程(AOP)是企业级应用的基石,可以这样说,如果大家要升级到高级程序员,这部分的知识必不可少. 这里我们将结合一些具体的案例来讲述这部分的知识,并且还将给出AOP部分的一些常见面 ...

  8. Spring MVC通过AOP切面编程 来拦截controller 实现日志的写入

    首选需要参考的是:[参考]http://www.cnblogs.com/guokai870510826/p/5977948.html    http://www.cnblogs.com/guokai8 ...

  9. Spring 面向切面编程(AOP)

    Spring 系列教程 Spring 框架介绍 Spring 框架模块 Spring开发环境搭建(Eclipse) 创建一个简单的Spring应用 Spring 控制反转容器(Inversion of ...

随机推荐

  1. Spring再接触 Annotation part2

    resource resource beans.xml <?xml version="1.0" encoding="UTF-8"?> <bea ...

  2. C# 小算法1

    //判断 第一条的 ‘叶子2’ 在 第二条 数据中的 索引 //任河特大桥,右幅,叶子2,桩基混凝土, //任河特大桥,,,,,右幅,,,叶子2,桥墩, string str1 = "任河特 ...

  3. 关于activity的一点总结(一)

    关于activity的重点: 参考网址:https://blog.csdn.net/qq_26787115/article/details/52556842 一.activity生命周期. 二..启动 ...

  4. 开源虚拟化KVM(三)管理虚拟网络

    六,管理虚拟网络 [x] Linux网桥基本概念 [x] qemu-kvm支持的网络 [x] 向虚拟机添加虚拟网络连接 [x] 基于NAT的虚拟网络 [x] 基于网桥的虚拟网络 [x] 用户自定义的隔 ...

  5. unable to resolve module react-native-gesture-handler from

    在安装了npm install --save react-navigation后跑项目然后就红屏了. 解决方法: 安装触摸方式(需要执行以下方法) npm install --save react-n ...

  6. HTML入门第三天

    三. 表格table(表格类数据): 1.表格标签(重中之重) 基本结构标签: <table>:定义表格区域 <tr>:定义表格的行 <td>:定义表格中的单元格 ...

  7. PhoenixFD插件流体模拟——UI布局【Foam】详解

    流体泡沫 本文主要讲解Foam折叠栏中的内容.原文地址:https://docs.chaosgroup.com/display/PHX3MAX/Liquid+Foam 主要内容 Overview 综述 ...

  8. Android 获取版本号名称工具类

    package com.example.grenaderose.redthunder.utils; import android.content.Context; import android.con ...

  9. Synchronized的几种用法

    https://blog.csdn.net/luoweifu/article/details/46613015

  10. webpack and publish lib

    http://keer2345.github.io/2018/04/13/webpack-4-tutorial-example-with-npm/ https://blog.csdn.net/feng ...