Spring 4连接点获取方法参数名称和值

时间:2017-06-19 16:37:13

标签: spring spring-aop

我正在使用Spring 4.3。是否可以获取传递给它的方法参数名称和值?我相信这可以使用AOP(建议之前),如果可能的话,请给我一个源代码。

4 个答案:

答案 0 :(得分:8)

以下按预期工作(Java 8 + Spring 5.0.4 + AspectJ 1.8.13):

@Aspect
@Component
public class SomeAspect {

    @Around("@annotation(SomeAnnotation)")
    public Object aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {
        CodeSignature codeSignature = (CodeSignature) joinPoint.getSignature();

        System.out.println("First parameter's name: " + codeSignature.getParameterNames()[0]);
        System.out.println("First argument's value: " + joinPoint.getArgs()[0]);

        return joinPoint.proceed();
    }
}

答案 1 :(得分:4)

CodeSignature methodSignature = (CodedSignature) joinPoint.getSignature();
String[] sigParamNames = codeSignature.getParameterNames(); 

您可以获取方法签名参数名称。

答案 2 :(得分:0)

不幸的是,你不能这样做。这是字节码的一个众所周知的限制 - 参数名称不能使用反射获得,因为它们并不总是存储在字节码中。

作为解决方法,您可以添加其他注释,例如@ParamName(name = "paramName")

这样,您可以通过以下方式获取params名称:

MethodSignature.getMethod().getParameterAnnotations()

更新

从Java 8开始,你可以这样做

  

您可以使用方法java.lang.reflect.Executable.getParameters获取任何方法或构造函数的形式参数的名称。 (Method和Constructor类扩展了类Executable,因此继承了Executable.getParameters方法。)但是,.class文件默认不存储形式参数名。这是因为许多生成和使用类文件的工具可能不会期望包含参数名称的.class文件的更大静态和动态占用空间。特别是,这些工具必须处理更大的.class文件,Java虚拟机(JVM)将使用更多内存。此外,某些参数名称(如机密或密码)可能会公开有关安全敏感方法的信息。

     

将正式参数名称存储在特定的.class文件中,从而   启用Reflection API以检索形式参数名称,编译   带有javac编译器的-parameters选项的源文件。

https://docs.oracle.com/javase/tutorial/reflect/member/methodparameterreflection.html

答案 3 :(得分:0)