2016-11-07 45 views
1

我目前正在使用命令行客户端进行自动测试。为此,我希望能够通过给定名称执行请求,所以我必须使用反射。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(请求)返回一个对象(其是列表<美孚>

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

+0

在你的代码中,'Request'是什么? – fxm

+0

请求是一个提供我想测试的服务请求的类。这个请求需要一个可以像上面那样设置的作业,因为Request包含一个带作业对象的列表(在本例中为“Foo”)。 – Zweistein2

回答

4

由于type erasure,一个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); 
+1

以秒为单位打败我。 – Axel

+0

与此代码我得到一个“java.lang.IllegalArgumentException:对象不是一个声明类的实例” – Zweistein2

+0

你是否已将'Request'更改为'jobObject'? –