【问题标题】:Why do I have the wrong number of arguments when calling main through reflection?为什么通过反射调用 main 时参数数量错误?
【发布时间】:2014-02-25 18:00:38
【问题描述】:

我有一个 Class 对象,我想调用一个静态方法。我有以下代码。

Method m = cls.getMethod("main", String[].class);
System.out.println(m.getParameterTypes().length);
System.out.println(Arrays.toString(m.getParameterTypes()));
System.out.println(m.getName());
m.invoke(null, new String[]{});

打印出来:

1
[class [Ljava.lang.String;]
main

然后它会抛出:

IllegalArgumentException: wrong number of arguments

我在这里俯瞰什么?

【问题讨论】:

    标签: java reflection


    【解决方案1】:

    你必须使用

    m.invoke(null, (Object)new String[]{});
    

    invoke(Object, Object...) 方法接受 Object...(更正) 传递的String[] 数组用作Object[] 并且是空的,因此它没有元素可以传递给您的方法调用。通过将其转换为 Object,您是说这是包装 Object[] 中的唯一元素。

    这是因为数组协方差。你可以这样做

    public static void method(Object[] a) {}
    ...
    method(new String[] {});
    

    因为String[]Object[]

    System.out.println(new String[]{} instanceof Object[]); // returns true
    

    或者,您可以将 String[] 包装在 Object[]

    m.invoke(null, new Object[]{new String[]{}});
    

    然后,该方法将使用 Object[] 中的元素作为方法调用的参数。

    小心调用main(..)的StackOverflowError。

    【讨论】:

      【解决方案2】:

      你可以这样做:

      Method m = cls.getMethod("main", String[].class);
      System.out.println(m.getParameterTypes().length);
      System.out.println(Arrays.toString(m.getParameterTypes()));
      System.out.println(m.getName());
      String[] a = new String[1];
      m.invoke(null, a);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-19
        • 2016-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-26
        • 2014-11-25
        • 1970-01-01
        相关资源
        最近更新 更多