java - 在方法调用期间将数组作为参数传递时出现 IllegalArgumentException

标签 java exception reflection parameters

我一定错过了一些非常基本的东西。当我尝试在方法调用期间传递任何类型的数组时,出现错误。但是,当我正常执行时,它会起作用。

这是失败的完整代码

import java.lang.reflect.Method;

public class Main {
    public static void main(String[] args) throws Exception {

        // Normal
        MyClass.sayHello(new String[] {"StackOverflow"});

        // Reflection
        Method m = MyClass.class.getMethod("sayHello", String[].class);
        m.invoke(null, new String[]{"StackOverflow"});
    }

    static class MyClass {
        public static void sayHello(String[] args) {
            System.out.println("Hello " + args[0]);
        }
    }
}

抛出的异常

Exception in thread "main" java.lang.IllegalArgumentException: argument type mismatch
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at Main.main(Main.java:11)

String... 也不起作用。

最佳答案

问题是 invoke 的第二个参数是一个参数数组——您只指定了一个参数。

在大多数情况下,因为 Method.invoke 的第二个参数是一个可变参数,但是因为你的参数已经是一个与 Object[] 兼容的数组,编译器不会创建包装器数组。我希望您会收到这样的编译时警告:

Main.java:11: warning: non-varargs call of varargs method with inexact argument type for
                       last parameter;
        m.invoke(null, new String[]{"StackOverflow"});
                       ^
  cast to Object for a varargs call
  cast to Object[] for a non-varargs call and to suppress this warning

您可以显式创建一个数组来包装参数,或者将参数转换为 Object 以便编译器需要自己包装它:

// Creates the wrapper array explicitly
m.invoke(null, new Object[] { new String[] { "StackOverflow" } });

// Compiler creates the wrapper array because the argument type is just Object
m.invoke(null, (Object) new String[] { "StackOverflow" });

关于java - 在方法调用期间将数组作为参数传递时出现 IllegalArgumentException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32385269/

相关文章:

winforms - 防止出现未处理异常的 "[YourProgramName] has stopped working"对话框

android - 从收件箱中删除短信时出现奇怪的异常

objective-c - Objective-C 属性中转换为 Swift 4 时出现反射错误

java - 使用反射调用类中的所有 setter

java - 延迟加载数据表使用 FetchType.EAGER 显示重复结果

java - 使用显式类型转换将十六进制整数转换为字符?

java - 在 JVM 中加载数千个类是否会影响方法执行的性能

java - Apache 点燃: Node has not been connected to topology

c# - 如何在 .NET 的基类静态方法中获取类类型?

java - 无法从 Throwable 转换为 MyException