zoukankan      html  css  js  c++  java
  • AOP方法拦截获取参数上的注解

    https://www.jianshu.com/p/f5c7417a75f9

    获取参数注解

    在spring aop中,无论是前置通知的参数JoinPoint,还是环绕通知的参数ProceedingJoinPoint,都可以通过以下方法获得入参:
    MethodSignature signature= (MethodSignature) jp.getSignature();

     
    根据源码分析,MethodSignature封装了两个方法,一个获取方法的返回值类型,一个是获取封装的Method对象,

    getReturnType()可以用在环绕通知中,我们可以根据这个class类型,做定制化操作.而method的参数和参数上的注解,就可以从getMethod()返回的Method对象中拿,api如下:
    // 获取方法上的注解
    XXX xxx = signature.getMethod().getAnnotation(XXX.class)
    //获取所有参数上的注解
    Annotation[][] parameterAnnotations= signature.getMethod().getParameterAnnotations();

    只有所有的参数注解怎么获取对应参数的值呢?

    获取所有参数注解返回的是一个二维数组Annotation[][],每个参数上可能有多个注解,是一个一维数组,多个参数又是一维数组,就组成了二维数组,所有我们在遍历的时候,第一次遍历拿到的数组下标就是方法参数的下标,
    for (Annotation[] parameterAnnotation: parameterAnnotations) {
        int paramIndex= ArrayUtils.indexOf(parameterAnnotations, parameterAnnotation);
    }
    再根据Object[] args= joinPoint.getArgs();拿到所有的参数,根据指定的下标即可拿到对象的值
    for (Annotation[] parameterAnnotation: parameterAnnotations) {
        int paramIndex= ArrayUtils.indexOf(parameterAnnotations, parameterAnnotation);
        for (Annotation annotation: parameterAnnotation) {
            if (annotation instanceof XXX){
                    Object paramValue = args[paramIndex]
            }
        }
    }

    通过以上方法,即可找到你想要的参数注解,并拿到对应参数的值啦!

  • 相关阅读:
    C# 实现 Snowflake算法生成唯一性Id
    kafka可视化客户端工具(Kafka Tool)的基本使用(转)
    docker 安装kafka
    Model类代码生成器
    使用docker 部署rabbitmq 镜像
    Vue 增删改查 demo
    git 提交代码到库
    Android ble蓝牙问题
    mac 配置 ssh 到git (Could not resolve hostname github.com, Failed to connect to github.com port 443 Operation timed out)
    okhttp
  • 原文地址:https://www.cnblogs.com/kelelipeng/p/12009680.html
Copyright © 2011-2022 走看看