Spring AOP获取基于参数名

时间:2017-08-17 13:55:03

标签: spring spring-aop

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

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

Method method = signature.getMethod();

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

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

proceedingJoinPoint.getArgs()

将返回值而不是名称

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

2 个答案:

答案 0 :(得分:3)

当我不得不使用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个参数值。

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

答案 1 :(得分:0)

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

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;

}