参数类型为Object []时通过反射调用方法

时间:2012-03-07 04:19:03

标签: java reflection

我使用反射来调用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[]作为Object的序列被传递。这是发生了什么?如果是这样,我怎么能强迫它不这样做?

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:1)

试试这个:

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*),而且当有一个相同类型的vararg时,Idea会在传递数组时触发检查。