2016-03-01 8 views
1

Am с помощью Java Reflection, Здесь я использую объект org.openqa.selenium.remote.RemoteWebElement, чтобы вызвать метод под названием SendKeys. Этот метод будет принимать characterSequence Array как тип параметра, поэтому передайте characterSequence [] в качестве параметра. Использование classname.getMethod (sendKeys, characterSequence []) Я могу получить имя метода. Но когда этот метод innvoked в выполнения прохождения массива characterSequences [] в качестве аргумента он бросаетJAVA ОТРАЖЕНИЕ: java.lang.IllegalArgumentException: тип аргумента несоответствие

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); 
+0

'new CharSequence [] {'a', 'b'}' неверно. '' a'' является типом char и поэтому не может быть преобразован в 'CharSequence'. Вы должны перейти на 'new CharSequence [] {" a "," b "}', и он будет работать. –

+0

новый CharSequence [] {«a», «b»} также не работает, показывая незаконный аргумент. Исключение –

ответ

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[] объект массива.

+0

Ошибка: CharSequence [] arr = CharSequence []) Array.newInstance (CharSequence.class, 1); arr [0] = "ab"; returnObj = myMethod.invoke (objToCallWith, новый объект [] {arr}); –

+0

Приятно слышать это. –

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

Пожалуйста, добавьте некоторое объяснение. В противном случае он скорее всего будет удален. – rghome

+0

Пожалуйста, добавьте некоторое объяснение. В настоящее время ваш ответ помечен как «низкое качество» и может быть удален. –

Смежные вопросы