Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.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,我尝试用以下代码调用私有方法。但我有一个非法的例外 java.lang.IllegalArgumentException:参数数目错误 代码是: Method method = MyClass.class.getDeclaredMethod("myMethod", String[].class); method.setAccessible(true); method.invoke(myClassInstance, new String[] { "a", "b" }); 正在调用的方法的签名为:

我尝试用以下代码调用私有方法。但我有一个非法的例外

java.lang.IllegalArgumentException:参数数目错误

代码是:

Method method = MyClass.class.getDeclaredMethod("myMethod", String[].class);
method.setAccessible(true);
method.invoke(myClassInstance, new String[] { "a", "b" });
正在调用的方法的签名为:

private void myMethod(String[] args)
我尝试了同样的例子,但是使用了一个以字符串为参数的方法,效果很好


非常感谢

编译器将字符串数组视为varargs。然后您的invoke方法将看到2个字符串作为参数传递,而不是字符串数组。

我手头没有可测试的编译器,但我怀疑
String[]
是作为整个
对象…
参数传递的,而不是作为单个元素传递的。尝试
method.invoke(myClassInstance,新对象[]{newstring[]{“a”,“b”})成功了。你有什么解释吗?这只是Java的工作原理,你可以调用varargs函数
foo(Object…x)
作为
foo(a,b,c)
foo(new Object[]{a,b,c})
。编译器将您的代码解释为后者。要强制它将其解释为前者,您需要手动添加样板。在
调用(Object obj,Object…args)
args
中,args必须包含参数,而不是参数。当您传递
新字符串[]{“a”,“b”}
时,它被视为
args的表示形式(我们可以使用Object[]来保存字符串[])。但由于该数组包含两个参数:
a
b
,所以您得到了异常。因此,要么显式地将数组包装到对象[](这样invoke就可以使用
args[0]
来获取数组),要么将其强制转换为对象,比如
(Object)新字符串[]{“a”,“b”}
,让varargs将其视为需要包装到varargs数组中的单个参数。