如何使用反射调用采用数组的方法

时间:2014-02-27 12:41:16

标签: java arrays

考虑以下完整的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原封不动的

1 个答案:

答案 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数组成为单个参数。