【问题标题】:Java Reflection - NoSuchMethodException Thrown when method existsJava 反射 - 方法存在时抛出 NoSuchMethodException
【发布时间】:2017-02-07 20:45:58
【问题描述】:

我正在尝试创建一个方法,该方法采用两个字符串参数并调用对象的方法调用。这两个参数将提供类名和方法名。理想情况下,我想使用反射来查找对象和方法,然后调用该方法。这是针对我管理的自动化套件。

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 static void 方法。

【问题讨论】:

  • String 类没有 isPageDisplayed() 方法。你的方法调用正确吗?

标签: java reflection automation qa


【解决方案1】:

由于classNameString 类型,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);  
}

【讨论】:

  • 我刚试过这个,我收到 java.lang.ClassNotFoundException
  • @MikeG 表示当前 JVM 类加载器找不到该类,即不在类路径上。或者可能是您没有提供完全限定的类名。
  • 感谢您的帮助。
  • 我希望我可以只指定类名而不是完全限定的类名。显然我不能。
【解决方案2】:

String className 应该是 Object 类。否则,它假定该方法在 String 的实例中。

【讨论】:

    【解决方案3】:

    假设您有要调用方法的对象,然后将其传递给方法而不是类名。另外,你应该使用getDeclaredMethod,而不是getMethod

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-03
      • 1970-01-01
      • 2022-08-24
      相关资源
      最近更新 更多