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

标签 java arrays reflection

我使用java反射,这里使用对象org.openqa.selenium.remote.RemoteWebElement来调用名为sendKeys的方法。 此方法将接受字符序列数组作为参数类型,因此我将字符序列[]作为参数传递。使用 classname.getMethod(sendKeys, characterSequence[]) 我可以获得方法名称。 但是,当在运行时调用此方法并传递 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);

最佳答案

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"}),与 one CharSequence[] 数组对象。

关于JAVA REFLECTION : java. lang.IllegalArgumentException:参数类型不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35715932/

相关文章:

c++ - 还有哪些其他语言可以通过指针操作来创建数组?

Javascript递增列表列表

java - 使用反射的静态方法

go - 从Go结构中提取标签作为reflect.Value

java - 如何在模拟 LocalDateTime 时模拟分钟值?

java - JPA with Hibernate 3 - ManyToMany-Stack overflow 和 Multiple bag errors

c - 如何在 C 中不使用数组的情况下读取给定的 "n"输入?

c# - 使用反射获取字典值

java - JBoss AS 7 关闭 - 连接管理器在 WAR 部署停止之前关闭

java - 将方法实现到按钮监听器中时出错