Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用反射获取方法的参数_Java_Reflection - Fatal编程技术网

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

Java 如何使用反射获取方法的参数,java,reflection,Java,Reflection,我被这个问题困住了。我对思考是相当陌生的 我有一个方法,比如: void foo(String s, int i){...} 假设有人用foo(“hey”,5)的输入调用这个方法 如何使用反射获取值“hey”和5?当我尝试这样做时,我只得到一大堆字符串和整数对象变量。反射是关于在“元”级别访问程序,所以您可以修改如何组合程序的细节(对象、类)。在通常的“正常”水平上访问变量和参数的实际值 我不确定为什么您不能在通常的“正常、非元”级别访问参数,可能您正试图在堆栈中或其他线程上查看方法的参数?为

我被这个问题困住了。我对思考是相当陌生的

我有一个方法,比如:

void foo(String s, int i){...}
假设有人用
foo(“hey”,5)的输入调用这个方法


如何使用反射获取值“hey”和5?当我尝试这样做时,我只得到一大堆字符串和整数对象变量。

反射是关于在“元”级别访问程序,所以您可以修改如何组合程序的细节(对象、类)。在通常的“正常”水平上访问变量和参数的实际值


我不确定为什么您不能在通常的“正常、非元”级别访问参数,可能您正试图在堆栈中或其他线程上查看方法的参数?为此,您可能需要使用调试接口,如。

听起来您谈论的是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是一种先进的技术,您需要做一些功课才能有效地使用它。有关上述示例的详细信息,请参阅。

我认为,思考如何实现您在这里想要做的事情时,反思是一种误导

把反射想象成看着一辆汽车,发现它有轮子、发动机、座椅等,以及它们是什么类型的。这与找出这些部件在给定时刻的工作方式无关。我知道这不是一个很好的类比,但我希望它能有所帮助。反射意味着你从外面看汽车,决定它的外观和功能。从“内部”查找参数的值

基本上,如果您有一个java类,您可以使用反射来了解它有哪些方法、属性以及它们的类型,并调用它们。但是,在这里,您希望对反射执行的操作就像调用一个方法,然后从该方法的“外部”神奇地找到它的参数


你说“我正在练习,我想把所有的东西都输出到显示器上”。为什么不把参数记录下来或打印到输出流中呢?或者像有人说的那样,使用调试器。

@user743949我想我们需要更多关于您试图实现的目标的信息。什么是反射什么?我正在练习,我想把所有的东西都输出到显示器上。你想在哪里进行反射?在
foo
中?我认为你不能用反射“拦截”方法调用。你可以检查一个对象并发现它的属性、方法、参数等,但当有人调用
foo
时,你不能抓取方法调用。有没有一种方法可以让我查看输入的字符串/Int对象并在其中查找值?@user743949:字符串和Int就是其中的值。你还想要什么价值?很好地了解提问者可能真正想要什么,而不需要提问者表达出来!