当前位置: 首页 > 面试题库 >

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

徐昆
2023-03-14
问题内容

考虑以下代码:

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

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

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


问题答案:

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

如果您需要该功能,则需要拦截方法调用,可以通过以下几种方法之一进行操作:

  • 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
    }

}


 类似资料:
  • 问题内容: 是否可以获取通用参数的类型? 一个例子: 问题答案: 我曾经偶然发现的一种结构看起来像 因此,似乎有些不可思议的想法使我感到遗憾,我很不了解…对不起。

  • 问题内容: 我在Java中有一个对象(基本上是VO),但不知道其类型。 我需要获取在该对象中不为null的值。 如何才能做到这一点? 问题答案: 你可以用来获取该类的所有声明的字段。你可以用来获取价值。 简而言之: 要了解有关反射的更多信息,请查看有关该主题的Sun教程。 就是说,这些字段不一定全部代表VO的属性。你希望确定以或开头的公共方法,然后调用它以获取真实属性值。 也就是说,可能会有更优雅

  • 问题内容: 我有一个这样声明的枚举: 现在,我想通过反射找出该枚举的键(SystemRunning,SystemStopped,tmpIdle): 输出为:RUNNING STOPPED IDLE 但是,我想使用Strings SystemRunning,tmpIdle等。 提前非常感谢您。 问题答案: 首先,您需要使您的非静态变量。 然后,您需要在枚举中添加getter方法,该方法将返回 然后将

  • 我用java反射写了下面的代码。在这段代码中,我调用了有参数的方法1(),代码运行时没有错误。没关系。但是我如何调用没有参数的方法2()和方法3()呢?如何在java反射中调用没有参数的方法?Java支持这样的功能吗?

  • 最近对一个应用程序进行的审计发现了一个XSS反射漏洞: 如源代码中所示,参数idPage上的用户控制输入将直接传递到呈现的网页: 我能做些什么来解决这个问题?

  • 要 动态获取一个对象方法的信息,首先需要通过下列方法之一创建一个 类型的对象或者数组。 getMethods() getMethods(String name,Class<?> …parameterTypes) getDeclaredMethods() getDeclaredMethods(String name,Class<?>...parameterTypes) 如果是访问指定的构造方法,需要