【问题标题】:Call method via reflection when argument is of type Object[]当参数类型为 Object[] 时通过反射调用方法
【发布时间】:2012-03-07 04:19:02
【问题描述】:

我正在使用反射来调用a class that is dynamically constructed at runtime上的方法:

public String createJDBCProvider(Object[] args)

方法如下:

Method m = adminTask.getClass().getMethod("createJDBCProvider", Object[].class);
id = (String) m.invoke(adminTask, new Object[]{ "a", "b", "c" });

IDEA 警告我,我犯了redundant array creation for calling varargs method 的罪行。

我调用的方法实际上需要一个Object[],而不是Object ...,但我认为它们可能是等效的且可以互换的,所以我继续前进。

在运行时我得到:

java.lang.IllegalArgumentException: wrong number of arguments

因此,我的Object[] 似乎是作为Objects 的序列传递的。这是正在发生的事情吗?如果是这样,我怎么能强迫它不这样做?

【问题讨论】:

  • 你在实际代码中用什么代替... 是最相关的部分。您能否展示一下您的真实代码中的内容?
  • Java 中的可变参数只是语法糖。编译器将Object... 转换为Object[]。所以是的,它们是等价的。

标签: java reflection


【解决方案1】:

您调用方法的方式,反射认为您正在传递三个单独的参数,而不是单个数组参数。试试这个:

id = (String) m.invoke(adminTask, new Object[]{ new Object[] {"a", "b", "c"} });

【讨论】:

  • Ack,我想过尝试这个,但没有,因为它似乎太不可能了。谢谢。
【解决方案2】:

试试这个:

Method m = adminTask.getClass().getMethod("createJDBCProvider", Object[].class);
id = (String) m.invoke(adminTask, new String[]{ "a", "b", "c" });

方法调用的签名是public Object invoke(Object obj, *Object... args*),并且当需要相同类型的可变参数时,Idea 具有在传递数组时触发的检查。

【讨论】:

    猜你喜欢
    • 2016-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多