我使用反射来调用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
的序列被传递。这是发生了什么?如果是这样,我怎么能强迫它不这样做?
答案 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会在传递数组时触发检查。