Отражение Java - NoSuchMethodException Брошенный, когда метод существует

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

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);
}

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

3 ответа

Решение

Поскольку 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);  
}

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

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

public void executeMethod(Object object, String methodName) {
    Class clazz = object.getClass(); 
    Method method = clazz.getDeclaredMethod(methodName); 
    method.invoke(object);  
}
Другие вопросы по тегам