考虑以下完整的Java程序。
public class Reflection
{
static class A
{
public void useArray( String[] args )
{
System.out.println( "Args are " + Arrays.toString( args ) );
}
}
public static void main( String[] args ) throws Exception
{
Method m = A.class.getMethod( "useArray", String[].class );
m.invoke( new A(), new String[] { "Hi" } );
}
}
尝试运行此操作时,会出现错误:
Exception in thread "main" java.lang.IllegalArgumentException: argument type mismatch
如果不是只传递给传递给invoke
的数组中的一个字符串而是传递多个字符串,那么你得到:
Exception in thread "main" java.lang.IllegalArgumentException: wrong number of arguments
所以,显然,因为invoke
的签名是:
invoke(java.lang.Object obj, java.lang.Object... args)
当我使用数组调用invoke
时,调用将被“翻译”为:
m.invoke( new A(), "Hi" );
如何让Java了解我确实希望将我的数组传递给invoke
原封不动的
答案 0 :(得分:3)
尝试将数组转换为Object
m.invoke(new A(), (Object)new String[] { "Hi" });
你必须这样做,因为数组如果Strings是Objects数组的子类型,那是因为
invoke(java.lang.Object obj, java.lang.Object... args)
使用对象数组,它可以解释为您在字符串数组中传递方法的参数。将它转换为单个Object将使varargs ...
将其作为单个元素读取,而不是元素数组。
其他解决方案是使用单独的对象数组(如
)包装数组m.invoke(new A(), new Object[]{new String[] { "Hi" }});
这样,您的String数组将不再是invoke
的参数数组。这次是外部数组,它将是带参数的数组,这使得String数组成为单个参数。