gpt4 book ai didi

Java 反射 : getMethod(String method, Object[].class) 不工作

转载 作者:搜寻专家 更新时间:2023-10-30 21:01:45 26 4
gpt4 key购买 nike

我有以下代码:

public void myMethod(Object... args) {
System.out.println("this is myMethod");
}

public void invokeMyMethod() {
Method s = this.getClass().getMethod("myMethod", Object[].class);
Object[] ex = new Object[2];
ex[0] = "hi";
ex[1] = "there";
s.invoke(this, ex);
}

我收到异常 java.lang.IllegalArgumentException:参数数量错误。怎么了?

最佳答案

你需要像这样调用方法:

s.invoke(this, new Object[]{new Object[]{"hi", "there"}});

(...或使用@Jon 的回答中的替代方法。)

您当前代码失败的原因与 Java 中实现可变参数方法的方式有关。本质上,T1 xxx(T2... args)T1 xxx(T2[] args) 的语法糖.当你调用这些方法时,xxx(arg1, arg2, arg3)xxx(new T2[]{arg1, arg2, arg3}) 的语法糖.

在这种情况下,您正尝试使用具有相同数组基类型的另一个可变参数方法调用可变参数方法,并且代码有多种可能的解释。

当 varadic 调用有两种可能的解释时,Java 假定您正在尝试使用调用的“unsugared”版本而不是“sugared”版本。或者更准确地说,当且仅当时使用“加糖”解释:

  • 实参个数不等于形参个数,
  • 最后一个实参的赋值与最后一个形参的(数组)类型不兼容。

如果您有兴趣,此行为在 15.12.4.2 部分的 JLS 中指定。 .

所以...我的解决方案通过强制非可变参数解释和显式构造所需的数组来工作。 @Jon 的解决方案通过强制正确 varadic 解释来工作。

关于Java 反射 : getMethod(String method, Object[].class) 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5454249/

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