JAVA REFLECTION:java.lang.IllegalArgumentException:参数类型不匹配

时间:2016-03-01 06:15:52

标签: java arrays reflection

使用 java reflection ,这里使用对象org.openqa.selenium.remote.RemoteWebElement来调用名为sendKeys的方法。 此方法将接受characterSequence Array作为参数类型,因此将characterSequence []作为参数传递。使用classname.getMethod(sendKeys,characterSequence [])我可以得到methodname。 但是当这个方法在运行时被传递时,传递characterSequences []数组作为参数,它会抛出

java.lang.IllegalArgumentException: argument type mismatch
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.thbs.manager.Reflections.callSeleniumCommand(Reflections.java:115)
at com.google.manager.Testing.doTestExecution(Testing.java:105)
at com.google.manager.Testing.main(Testing.java:22)

无法发布整个代码,但发布了抛出错误的代码

objToCallWith = org.openqa.selenium.remote.RemoteWebElement
cls = objToCallWith.getClass();

methodName = sendKeys
params = CharSequence[].class
// send keys method accept only CharSequence[]
myMethod = cls.getMethod(methodName, params);

// able to getMethod

args = new CharSequence[]{'a','b'}
// Here Exception java.lang.IllegalArgumentException: argument type mismatch
myMethod.invoke(objToCallWith,args);

2 个答案:

答案 0 :(得分:0)

myMethod.invoke(objToCallWith,args);

应更改为:

myMethod.invoke(objToCallWith, new Object[]{args});

myMethod.invoke(objToCallWith, (Object)args);

这是因为Method.invoke也接受varargs参数。因此,myMethod.invoke(objToCallWith,args);相当于myMethod.invoke(objToCallWith,"a", "b");,它提供两个 CharSqeunce对象,而不是一个 CharSqeuqnce[]数组对象。

如您所知,foo(CharSequence... args)内部编译为foo(CharSqeuqnce[] arg)。因此,当您致电foo("a", "b")时,它位于内部foo(new CharSequence[]{"a", "b"}),并且一个 CharSequence[]数组对象。

答案 1 :(得分:-1)

CharSequence[]arr=CharSequence[])Array.newInstance(CharSequence.class,1);
arr[0]="ab";
returnObj = myMethod.invoke(objToCallWith,new Object[]{arr});