Spring AOP:访问参数名称

Luc*_*sio 7 java spring spring-aop

我正在使用Spring 3.x,Java 6.

我有一个带有以下连接点的@Around方面:

@Around("execution(public * my.service.*.*Connector.*(..))")
Run Code Online (Sandbox Code Playgroud)

因此,我基本上对拦截所有对类的公共方法的调用感兴趣,类名以"Connector"结尾.到现在为止还挺好.

现在,在我的方面,我想访问方法的实际参数名称:

public doStuff(String myarg, Long anotherArg)
Run Code Online (Sandbox Code Playgroud)

myarg另一个Arg

我明白使用:

CodeSignature signature = (CodeSignature)jointPoint.getSignature();
return signature.getParameterNames();
Run Code Online (Sandbox Code Playgroud)

将实际工作,但只有我用" -g "标志(完全调试)编译代码,我宁愿不这样做.

有没有其他方法可以访问这种运行时信息.

谢谢L

Tom*_*icz 6

不幸的是你不能这样做:-(.这是一个众所周知的JVM /字节码限制 - 使用反射无法获得参数名称,因为它们并不总是存储在字节码中(与方法/类名相反) .

作为一种解决方法,几个框架/规范引入了诸如WebParam(nameproperty)或PathParam.之类的参数的自定义注释.

目前,没有注释的所有内容都是一系列值.


Boz*_*zho 5

检查 的实现org.springframework.core.ParameterNameDiscoverer

如果未设置,则 spring 使用的注释@RequestParam会检查参数名称value。因此@RequestParam String foo实际上会获取名为“foo”的请求参数。它使用该ParameterNameDiscoverer机制。我只是不确定使用了哪些实现,请尝试每个实现。

读取LocalVariableTableParameterNameDiscoverer.class使用 asm 检查名称。

所以,这是可能的。但请确保缓存此信息(例如 - 将参数名称存储在映射中,其中键 = 类+方法+参数索引)。

但是,正如文档中所述,您需要调试信息。来自以下文档@PathVariable

只有在启用调试的情况下编译代码时,才能将方法参数名称与 URI 模板变量名称进行匹配。如果未启用调试,则必须在 @PathVariable 注释中指定 URI 模板变量名的名称,以便将变量名的解析值绑定到方法参数

因此,如果您确实不想包含该信息,Tomasz Nurkiewicz 的答案解释了解决方法。