基于参数名称获取Spring AOP方法参数值

9
在Spring AOP中,是否可以根据参数名称获取方法参数值?
MethodSignature signature = (MethodSignature) proceedingJoinPoint.getSignature();

Method method = signature.getMethod();

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

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

proceedingJoinPoint.getArgs()

将返回值而不是名称

那么,是否有可能根据参数名称获取值?

2个回答

11

我在各处搜索中并没有找到一种能够根据名称获取参数值的函数,因此我编写了一个简单的方法来实现这个功能。

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;

}

8

当我需要使用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 个参数值。
我找不到支持这种行为的文档,但是嘿,这段代码已经在生产服务器上运行了一年左右,并且从未产生过错误结果。尽管我很高兴如果有人能够链接到这种行为的文档。您甚至可以深入研究反射的代码以验证此行为。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接