Java 如何使用反射以字符串数组作为参数调用私有方法
我尝试用以下代码调用私有方法。但我有一个非法的例外 java.lang.IllegalArgumentException:参数数目错误 代码是: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" }); 正在调用的方法的签名为:
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数组中的单个参数。