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

数组中的参数时调用Method.invoke()

贡可人
2023-03-14
问题内容

我有以下界面:

interface Foo {
  void bar(String a, int b);
}

我想Foo.bar反射性地(在Foo的实现上)调用。 但是,参数在数组中 ,我不知道它的大小。

以下内容不起作用:

void gee(Foo someFoo, Method bar, Object[] args) {
  bar.invoke(someFoo, args);
}

那是行不通的,因为args它受到编译器作为单个参数的威胁,并且该数组未“扩展”为vararg,而是被(内部)包装为另一个具有单个元素的数组,即

@Test
public void varArgTest() {
  assertTrue(varArgFoo(new Object[] {1, 2}) == 1);
}

private static <T> int varArgFoo(T... arg) {
    return arg.length;
}

Method.invoke()在这种情况下,我该如何调用,以使阵列受到vararg的威胁?
或更笼统的问题:当参数在数组中时,如何调用vararg方法?直到运行时我才知道数组的大小。


问题答案:

以下内容不起作用:

是的,它确实。

那是行不通的,因为args作为单个参数受到编译器的威胁,并且该数组未“扩展”为vararg,而是(内部)包装在另一个具有单个元素的数组中,即

使用您提供的代码,数组的元素应成为varargs参数。如果这对您而言没有发生,则是您没有显示实际代码,或者其他错误。

如果您的args变量某种程度上没有数组类型(例如,键入Object),则可能会发生这种情况。但这不是您要显示的代码。

或者,如果您没有显示一些“附加”参数(例如,您正在尝试执行bar.invoke(someFoo, firstArg, args);,则该参数将不会扩展args,因为您已经在使用varargs形式的方法。



 类似资料:
  • 我需要使用thymeleaf从html调用一个javascript函数。在这个特定的例子中,我有一个student对象,我需要将这个student对象传递给javascript函数(edit())以便在单击按钮时进行处理。 重要代码段:

  • 问题内容: 我有一个功能可以做到这一点: 哪个发送到我的数据库类,它执行以下操作: 问题是这不起作用。 我希望做的是获取列表,并在后面列出它们,以使查询类似于: 但是很明显,我走错了路。 有没有办法使数组…按原样转换为要在查询阶段打印出来的列表? 问题答案: call_user_func_array “使用参数数组调用回调” 应该做的工作 更新 :您还必须更改您的params数组: 如预期的那样,

  • 问题内容: 我可以在参数 示例中使用几行吗 (:arrCity)(1,2,3,4,5,6) 但是现在我已经完成了 而且非常糟糕 问题答案:

  • 我正在尝试编写一个lambda,通过调用来监听来自CloudWatch的参数存储更改事件,并获取参数的历史数据。此方法失败,返回以下消息: BotoCore.Exceptions.ClienError:调用GetParameterHistory操作时出错(AccessDeniedException):密文引用的客户主密钥不存在、不在此区域中或不允许您访问。(服务:AWSKMS;状态代码:400;错

  • 我的语法有错误吗?或者这是不可能的? 抛出的错误是 New-AzResourceGroupDeployment:16:25:54-资源Microsoft.KeyVault/Vaults/Secrets“my-new-sub-Vault/my-Secret”失败,出现消息“{”错误“:{”代码“:”BadRequest“,”消息“:”缺少机密“}}”

  • 本文向大家介绍C#中参数数组、引用参数和输出参数示例详解,包括了C#中参数数组、引用参数和输出参数示例详解的使用技巧和注意事项,需要的朋友参考一下 前言 本文主要介绍了关于C#参数数组、引用参数和输出参数的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 参数数组 在C#中,可以为函数指定一个不定长的参数,这个参数是函数定义中的最后一个参数,这个参数叫做参数数组。 下面是一