【问题标题】:Spring AOP get method parameter value based on parameter nameSpring AOP根据参数名获取方法参数值
【发布时间】:2017-08-17 13:55:02
【问题描述】:

Spring AOP中是否可以根据参数名获取方法参数值。

MethodSignature signature = (MethodSignature) proceedingJoinPoint.getSignature();

Method method = signature.getMethod();

method.getParameters().getName() 
// possible to get the paramater names 

这种方法将获取参数名称,而不是值。

proceedingJoinPoint.getArgs()

将返回值而不是名称

那么是否可以根据参数名取值呢?

【问题讨论】:

    标签: spring spring-aop


    【解决方案1】:

    当我到处搜索时,不存在按名称提供参数值的函数,我编写了一个简单的方法来完成这项工作。

    public Object getParameterByName(ProceedingJoinPoint proceedingJoinPoint, String parameterName) {
        MethodSignature methodSig = (MethodSignature) proceedingJoinPoint.getSignature();
        Object[] args = proceedingJoinPoint.getArgs();
        String[] parametersName = methodSig.getParameterNames();
    
        int idx = Arrays.asList(parametersName).indexOf(parameterName);
    
        if(args.length > idx) { // parameter exist
            return args[idx];
        } // otherwise your parameter does not exist by given name
        return null;
    
    }
    

    【讨论】:

      【解决方案2】:

      当我不得不使用 AOP 记录函数参数及其值时,我搜索了同样的东西,但似乎没有直接的方法可以根据参数名称获取值。

      但我注意到method.getParameters().getName()proceedingJoinPoint.getArgs() 返回的值始终是同步的,即对于函数

      public void foo(String a, String b)
      

      称为

      foo("hello", "world");
      

      method.getParameters().getName() 按顺序返回 ["a", "b"] 和 proceedingJoinPoint.getArgs() 返回 ["hello", "world"]。因此,您可以按索引遍历数组,并且对于每个索引i,第 i 个参数名称将对应于第 i 个参数值。

      我找不到这种行为的支持文档,但是,嘿,这段代码已经在生产服务器上运行了大约一年,它从未产生过错误的结果。虽然如果有人可以链接到这种行为的文档,我会很高兴。您甚至可以深入研究反射的代码来验证这种行为。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-19
        • 1970-01-01
        • 2014-10-03
        • 2019-10-15
        • 1970-01-01
        相关资源
        最近更新 更多