java 反射列表 NoSuchMethodException
java reflections list 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) returns 一个对象(它是一个 List< Foo> )
我想要实现的是让代码使用动态输入(例如 Bar 而不是 Foo)
由于 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);
我目前正在开发用于自动化测试的命令行客户端。为此,我希望能够仅通过给定名称执行请求,因此我必须使用反射。
但是,我收到以下错误:
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) returns 一个对象(它是一个 List< Foo> )
我想要实现的是让代码使用动态输入(例如 Bar 而不是 Foo)
由于 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);