2017-02-07 16 views
1

Я пытаюсь создать метод, который принимает два строковых параметра и вызывает вызов метода для объекта. Эти два параметра будут снабжать className и methodName. В идеале я хотел использовать отражение, чтобы найти объект и метод, чтобы затем вызвать метод. Это для набора автоматизации, которым я управляю.Java Reflection - NoSuchMethodException Thrown, когда существует метод

public void executeMethod(String className, String methodName){ 
    Class object = className.getClass(); 
    Method objMethod = object.getMethod(methodName); 
    objMethod.invoke(pageObject); 
} 

Когда я запускаю его, я получаю сообщение об ошибке NoSuchMethodException: java.lang.String.isPageDisplayed().

Я считаю, что моя проблема существует с обнаружением объекта или чем-то связанным с объектом.

Если я выполнить тот же метод выше, как показано ниже, это работает:

public void executeMethod(String className, String methodName){ 
    Method objMethod = knownObject.class.getMethod(methodName); 
    m1.invoke(pageObject); 
} 

Может кто-нибудь помочь мне понять, что я делаю не так? Метод, в данном случае, я пытаюсь вызвать public public void method.

+0

класса Строки не имеет метода isPageDisplayed(). Правильно ли вы называете свой метод? – renanlf

ответ

0

С className имеет типа String, className.getClass() просто возвращает Class<String>, который, очевидно, не имеет методы в качестве члена. Вместо этого, вы должны использовать Class.forName(className):

public void executeMethod(String className, String methodName){ 
    Class<?> clazz = Class.forName(className); 
    Method objMethod = clazz.getMethod(methodName); 
    objMethod.invoke(pageObject); 
} 
+0

Я просто попробовал это, и я получаю java.lang.ClassNotFoundException – MikeG

+0

@MikeG Это означает, что класс не найден текущим загрузчиком классов JVM, то есть не на пути к классам. Или может быть, что вы не предоставили полное имя класса. – manouti

+0

Спасибо за помощь. – MikeG

0

Класс String класса должен быть классом Object. В противном случае предполагается, что метод находится внутри экземпляра String.

0

Если у вас есть объект, на котором вы хотите, чтобы вызвать метод затем передать его методу вместо имени класса. Кроме того, вы должны использовать getDeclaredMethod, не getMethod:

public void executeMethod(Object object, String methodName) { 
    Class clazz = object.getClass(); 
    Method method = clazz.getDeclaredMethod(methodName); 
    method.invoke(object); 
} 

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

  • Нет связанных вопросов^_^