如何使用反射获取方法的参数

时间:2011-05-12 20:49:42

标签: java reflection

我坚持这个问题。我很反思。

我有一种方法,比如说:

void foo(String s, int i){...}

假设某人使用foo("hey", 5);

的输入调用此方法

如何使用反射获取值“hey”和5?当我尝试这样做时,我只获得了一大堆String和Integer对象变量。

3 个答案:

答案 0 :(得分:8)

听起来你在谈论AOP(面向方面​​编程) - 而不是反思。方法拦截器将允许您在运行时访问调用(包括访问参数)。如何访问参数取决于API。

public class MyMethodInterceptor implements MethodInterceptor {

    public Object invoke(MethodInvocation invocation) throws Throwable {
        System.out.println("Before: invocation=[" + invocation + "]");

        // use MethodInvocation.getArguments() to access the runtime parameters
        System.out.println(Arrays.toString(methodInvocation.getArguments()));

        Object rval = invocation.proceed();
        System.out.println("Invocation returned");
        return rval;
    }
}

注意:AOP是一项先进技术,您需要做一些功课才能有效地使用它。有关上面给出的示例的详细信息,请参阅http://static.springsource.org/spring/docs/2.0.2/reference/aop-api.html

答案 1 :(得分:4)

反思是关于在“元”级别访问程序,因此您可以修改它如何组合在一起的细节(对象,类)。访问变量和参数的实际值是在通常的“正常”级别完成的。

我不确定为什么你不能在通常的“普通,非元”级别访问参数,也许你试图在堆栈或其他线程中查看方法的参数?为此,您可能需要使用JDI之类的调试界面。

答案 2 :(得分:3)

我认为反思是一种误入歧途的方式,可以考虑实现你想要做的事情。

将反思视为看车并发现它有车轮,发动机,座椅等,以及它们是什么类型。它不是要找出这些部件在特定时刻是如何工作的。我知道这不是一个很好的类比,但我希望它有所帮助。反思意味着你从外面看车,决定它的样子和它能做什么。找出参数的值是从“内部”完成的。

基本上,如果你有一个java类,你可以使用反射来知道它有哪些方法,属性以及它们的类型,并调用它们。但是你在这里用反射来做的就像调用一个方法并从方法的“外部”神奇地找出它的参数。

你说“我正在练习,我想将所有内容输出到显示器”。为什么不记录参数或将它们打印到输出流?或者有人说,使用调试器。