gpt4 book ai didi

java - 调用将字符串数组作为参数的方法导致 IllegalArgumentException

转载 作者:行者123 更新时间:2023-12-04 00:53:18 29 4
gpt4 key购买 nike

我正在使用运行时反射来加载一个包含以下两个方法的类:

public static void foo(int[] args)
{
System.out.print("foo invoked: ");
for(int arg : args)
System.out.print(arg + " ");

System.out.println();
}

public static void bar(String[] args)
{
System.out.print("bar invoked: ");
for(String arg : args)
System.out.print(arg + " ");

System.out.println();
}

(相同的方法,除了一个采用 int 数组而另一个采用字符串数组)

然后我尝试像这样调用这两个方法:

    int[] intArr = {1,2,3};
clazz.getMethod("foo", int[].class).invoke(null, intArr);

String[] strArr = {"1","2","3"};
clazz.getMethod("bar", String[].class).invoke(null, strArr); //Exception

(这里的'clazz'是这两个方法所在的类,我在运行时加载了它)

第一次调用没有导致异常并输出预期的输出,但第二次调用抛出以下异常:

Exception in thread "main" java.lang.IllegalArgumentException: wrong number of arguments
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:564)
at ReflectionTests.main(ReflectionTests.java:63)

这是为什么?

最佳答案

观察 invoke 有这个签名:

public Object invoke(Object obj, Object... args)

args 是一个可变参数,允许您将调用方法的每个参数作为 invoke 的参数传递,例如

someStaticMethod.invoke(null, param1, param2, param3);

会调用:

someStaticMethod(param1, param2, param3);

另一方面,args 的类型实际上只是Object[],并且存在从String[]Object[],因为数组是协变的。

因此,当您将 strArrString[] 传递给 invoke 时,可能会发生以下两种情况之一:

  • strArr 被转换为一个 Object[],每个 String 被视为要调用的方法的参数。<
  • 整个 strArr 被视为要调用的方法的参数之一,就像非数组类型一样。

编译器恰好更喜欢第一个(参见 here。请注意可变元数调用的优先级最低),因此您实际上传递了参数 "1", "2", "3" 到方法,而不是 one 单个 String[]

另一方面,int[]不能直接转换为Object[],因为int是原始的,所以编译器只能选择上面的第二个选项。

强制使用第二个选项的一种方法是转换为 Object:

clazz.getMethod("bar", String[].class).invoke(null, (Object)strArr);

另一种方法是创建另一个 Object[] 包装 String[]:

clazz.getMethod("bar", String[].class).invoke(null, new Object [] { strArr });

关于java - 调用将字符串数组作为参数的方法导致 IllegalArgumentException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64710392/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com