是否可以在Spring AOP中根据参数名称获取方法参数值。
MethodSignature signature = (MethodSignature) proceedingJoinPoint.getSignature();
Method method = signature.getMethod();
method.getParameters().getName()
// possible to get the paramater names
此方法将获取参数名称,而不是值。
proceedingJoinPoint.getArgs()
将返回值而不是名称
那么是否可以根据参数名称获取值?
答案 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;
}