java反射列表NoSuchMethodException



我目前正在开发一个用于自动测试的命令行客户端。为此,我希望能够仅通过给定名称执行请求,因此我必须使用反射。

但是,我得到以下错误:

NoSuchMethodException: java.util.ArrayList.add (some.path.Foo)

在此代码中:

Object job = Class.forName(sClassName).getConstructor().newInstance();
List<?> jobObject = (List<?>) Request.getClass().getDeclaredMethod(sMethodName).invoke(Request);
jobObject.getClass().getDeclaredMethod("add", job.getClass()).invoke(Request, job);

另一方面,以下代码可以工作(但不是解决方案,因为Foo应该是动态的,而不是硬编码的)

Object job = Class.forName(sClassName).getConstructor().newInstance();
List<Foo> jobObject = (List<Foo>) Request.getClass().getDeclaredMethod(sMethodName)).invoke(Request);
jobObject.add((Foo)job);

旁注:

  • sClassName = some.path.Foo
  • .getDeclaredMethod(sMethod).invoke(Request)返回一个Object(它是一个List

我想实现的是让代码与动态输入一起工作(例如Bar而不是Foo)

由于类型擦除List的方法add期望在运行时类型为Object的对象(换句话说,它的签名是boolean add(Object o)),而且你需要在jobObject上调用它,而不是在Request上,因为它不是List,所以你的代码应该是:

 jobObject.getClass().getDeclaredMethod("add", Object.class).invoke(jobObject, job);

除非我错过了什么你甚至不需要反思在这种情况下

List<Object> jobObject = (List<Object>)...
jobObject.add(job);

相关内容

  • 没有找到相关文章

最新更新