Spring Aop 如何获取参数名参数值

 更新时间:2021年07月19日 16:36:18   作者:小动物不困i  
这篇文章主要介绍了Spring Aop 如何获取参数名参数值的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

前言:

有时候我们在用Spring Aop面向切面编程,需要获取连接点(JoinPoint)方法参数名、参数值。

环境:

  • Mac OSX
  • Intellij IDEA
  • Spring Boot 2x
  • Jdk 1.8x

Code:

package com.example.aopdemo.aop; 
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.CodeSignature;
import org.springframework.stereotype.Component;
 
import java.util.HashMap;
import java.util.Map;
 
/**
 * DemoAop
 * Create by Gray(Ganguocai@outlook.com)
 */
@Aspect
@Component
@Slf4j
public class DemoAop {
 
    /**
     * 环绕通知
     * @param proceedingJoinPoint
     * @return
     * @throws Throwable
     */
    @Around(value = "execution(* com.example.aopdemo..*(..)))")
    public Object demoAop(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        
        log.debug("执行前:");
        
        Map<String, Object> params = getNameAndValue(proceedingJoinPoint);
        for (Map.Entry<String, Object> entry : params.entrySet()) {
            System.out.println("name: " + entry.getKey() + " value: " + entry.getValue());
        }
        
        Object object = proceedingJoinPoint.proceed();  //执行连接点方法,object:方法返回值
        
        log.debug("执行后:");
        
        return object;
    }
    /**
     * 获取参数Map集合
     * @param joinPoint
     * @return
     */
    Map<String, Object> getNameAndValue(ProceedingJoinPoint joinPoint) {
        Map<String, Object> param = new HashMap<>();
        Object[] paramValues = joinPoint.getArgs();
        String[] paramNames = ((CodeSignature)joinPoint.getSignature()).getParameterNames();
        for (int i = 0; i < paramNames.length; i++) {
            param.put(paramNames[i], paramValues[i]);
        }
        return param;
    }
}

AOP切面获取参数的一个小技巧

一般来说,我们的参数,都是通过json传递的,那么这个问题就转化成了,从json中获取指定字符串的问题。

OK,这个问题就简单了。

如下:

public static void main(String[] args) {
    // 这里JSONObject是fastjson-1.2.41.jar包下的
    JSONObject jsonObject = JSON.parseObject("{\"timeStamp\":21602756894612,\"status\":0,\"results\":{\"userName\":\"yang20102\",\"userLevel\":\"3\"},\"errorCode\":null,\"errorMessage\":null}");
    // 获取json最外层字符串
    Object timeStamp = jsonObject.get("timeStamp");
    System.out.println("timeStamp:" + timeStamp);
 
    // 获取复杂对象
    Object results = jsonObject.get("results");
    JSONObject jsonObjectResults = JSON.parseObject(results.toString());
    Object userName = jsonObjectResults.get("userName");
    System.out.println("userName:" + userName);
}

实例json如下:

{
  "timeStamp": 21602756894612,
  "status": 0,
  "results": {
    "userName": "yang20102",
    "userLevel": "3"
  },
  "errorCode": null,
  "errorMessage": null
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java日期工具类时间校验实现

    Java日期工具类时间校验实现

    一般项目中需要对入参进行校验,比如必须是一个合法的日期,本文就来介绍一下Java日期工具类时间校验实现,具有一定的参考价值,感兴趣的可以了解一下
    2023-12-12
  • 浅谈Java中FastJson的使用

    浅谈Java中FastJson的使用

    今天给大家带来的是关于Java的相关知识,文章围绕着FastJson的使用展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • 一文让你搞懂如何手写一个redis分布式锁

    一文让你搞懂如何手写一个redis分布式锁

    既然要搞懂Redis分布式锁,那肯定要有一个需要它的场景。高并发售票问题就是一个经典案例。本文就来利用这个场景手写一个redis分布式锁,让你彻底搞懂它
    2022-11-11
  • RocketMQ延迟消息超详细讲解

    RocketMQ延迟消息超详细讲解

    延时消息是指发送到 RocketMQ 后不会马上被消费者拉取到,而是等待固定的时间,才能被消费者拉取到。延时消息的使用场景很多,比如电商场景下关闭超时未支付的订单,某些场景下需要在固定时间后发送提示消息
    2023-02-02
  • JavaWeb中Session对象的学习笔记

    JavaWeb中Session对象的学习笔记

    在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象,即session对象,这篇文章就为大家详细介绍Session对象的定义、实现原理等基础知识点,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • 浅谈Java并发之同步器设计

    浅谈Java并发之同步器设计

    这篇文章主要介绍Java并发之同步器设计,本文以记录方式并发编程中同步器设计的一些共性特征。并简单介绍了Java中的AQS,需要的朋友可以参考一下文章的详细内容
    2021-10-10
  • Java工具类BeanUtils库介绍及实例详解

    Java工具类BeanUtils库介绍及实例详解

    这篇文章主要介绍了Java工具类BeanUtils库介绍及实例详解,需要的朋友可以参考下
    2020-02-02
  • 深入理解Java高级特性——注解

    深入理解Java高级特性——注解

    这篇文章主要介绍了Java高级特性——注解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • Java经典面试题最全汇总208道(二)

    Java经典面试题最全汇总208道(二)

    这篇文章主要介绍了Java经典面试题最全汇总208道(二),本文章内容详细,该模块分为了六个部分,本次为第二部分,需要的朋友可以参考下<BR>
    2023-01-01
  • Java并发编程之同步容器

    Java并发编程之同步容器

    这篇文章主要介绍了Java并发编程之同步容器,文中有非常详细的代码示例,对正在学习java的小伙伴们有很好的帮助,需要的朋友可以参考下
    2021-05-05

最新评论