如何在Java中通过反射获得方法参数的值?

请考虑以下代码:

public void example(String s, int i, @Foo Bar bar) {
    /* ... */
}

我对用 注释的参数的值感兴趣。假设我已经通过反射(with )弄清楚了哪个方法参数具有注释。(我知道这是参数列表的第三个参数。@FooMethod#getParameterAnnotations()@Foo

我现在如何检索 的值以供进一步使用?bar


答案 1

你不能。反射无权访问局部变量,包括方法参数。

如果需要该功能,则需要截获方法调用,可以通过以下几种方式之一执行此操作:

  • AOP (AspectJ / Spring AOP 等)
  • 代理(JDK,CGLib等)

在所有这些中,您将从方法调用中收集参数,然后告诉方法调用执行。但是没有办法通过反射来获取方法参数。

更新:这里有一个示例方面,可帮助您开始将基于注释的验证与AspectJ结合使用

public aspect ValidationAspect {

    pointcut serviceMethodCall() : execution(public * com.yourcompany.**.*(..));

    Object around(final Object[] args) : serviceMethodCall() && args(args){
        Signature signature = thisJoinPointStaticPart.getSignature();
        if(signature instanceof MethodSignature){
            MethodSignature ms = (MethodSignature) signature;
            Method method = ms.getMethod();
            Annotation[][] parameterAnnotations = 
                method.getParameterAnnotations();
            String[] parameterNames = ms.getParameterNames();
            for(int i = 0; i < parameterAnnotations.length; i++){
                Annotation[] annotations = parameterAnnotations[i];
                validateParameter(parameterNames[i], args[i],annotations);
            }
        }
        return proceed(args);
    }

    private void validateParameter(String paramName, Object object,
        Annotation[] annotations){

        // validate object against the annotations
        // throw a RuntimeException if validation fails
    }

}

答案 2