当前位置: 首页 > 面试题库 >

Java反射:getMethod(String method,Object []。class)不起作用

邹正阳
2023-03-14
问题内容

我有以下代码:

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})

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

当对可变调用有两种可能的解释时,Java会 假定 您尝试使用该调用的“未使用”版本而不是“使用”版本。或者更确切地说, 当且仅当

  • 实际参数的数量不等于形式参数的数量, 或者
  • 最后一个实际参数与最后一个形式参数的(数组)类型不兼容。

如果您有兴趣,可以在JLS的15.12.4.2节中指定此行为。

所以…我的解决方案通过强制执行非可变解释并显式构造所需的数组来工作。@Jon 的解决方案通过强制 正确的 方言解释来起作用。



 类似资料:
  • 我正在尝试使用maven插件创建GraalVM本机映像,但有一些问题 这里是maven插件的配置 我使用的是GraalVM JDK(通过Sdkman安装): 我有一个简单的主类: 当使用 得到的结果如下: 但是,当执行<code>mvn包 为什么会这样? 这里的git回购复制 这个问题似乎影响了Jackson的反序列化,因为在另一个示例中,我遇到了来自jackson的错误,该错误无法反序列化yam

  • 问题内容: 我正在尝试为各个字段使用不同的分析器设置ElasticSearch索引。但是,我似乎找不到一种设置特定于字段的分析器的方法。这是我创建(测试)索引的方法: 如果我正确阅读了文档,则应创建类型为“ tweet”的索引“ twitter”,并且应通过雪球词根分析器分析“ message”字段的内容。为了对此进行测试,我尝试了以下查询: 如果我没记错的话,那应该会受到打击,因为战斗是战斗的源

  • 我已经定义了对象HomeContentDTO和SubscriberUpsertDTO的映射 下面是这两个对象的映射配置 HomeContentDTO中的所有映射值都没有复制到SubscriberUpsertDTO。有人知道原因吗?

  • 但是,由于某种原因,总是,所以我不确定这是注释类的问题还是我使用反射的方式的问题。我很确定是后者,因为在调试时,我发现它能够访问带有注释的方法。如有任何帮助,不胜感激,谢谢!

  • 问题内容: 我试图将onscroll事件处理程序添加到特定的dom元素。看下面的代码: 代码非常简单,如您所见,我想处理div#list滚动。当我运行此示例时,它不起作用。所以我尝试直接在render方法上绑定this._handleScroll,它也不起作用。 因此,我打开了chrome inspector,直接使用以下命令添加了onscroll事件: 它正在工作!我不知道为什么会这样。这是Re

  • 问题内容: 为什么colspan属性在React中不起作用?我创建了呈现以下内容的简单组件: 编辑:解决 这是解决方案。React期望属性名称为 colSpan ,而不是colspan。在浪费了荒谬的时间去发现这个小小的邪恶事实之后,想出了这一点。 问题答案: 来自React的DOM差异文档: 所有DOM属性和属性(包括事件处理程序)都应包含驼峰,以与标准JavaScript样式保持一致。 如果您