这是一个复杂的问题,我会发现很难解释,所以我提前提出了。
想象一下,一个应用程序调用另一个项目方法。我需要一种生成数据的方法来匹配参数列表。显然,如果参数类型是我无法生成的某个类,那么它应该失败,但如果它是int[]
,int[][]
是List<String>
是Map<Integer, String>
,那么它是可能的。
我正在努力解决的是一个体面的方法。我可以通过method.getGenericParameterTypes();
获得参数的类型。例如,参数HashMap是java.util.HashMap<java.lang.String, java.lang.Integer>
,但有很多不同的可能性!
我想仿制药在这里有一些用处?唯一的问题是我无法控制正在调用的代码。如何使用其中一种类型,然后为其生成数据?
我很抱歉解释不周,任何帮助都感谢
感谢
在这里,我们看到了一个我想调用的方法的例子,我想记录运行所需的时间(这是通过反射完成的),但是,我需要为参数生成数据。我需要一种生成数据以匹配的方法
public void someMethod(Param a, Param b, Param c)
{
//some user code I have no control over
}
我认为问题应该是为什么需要这样做。也许如果您解释了您的使用/业务案例,我们可以提供一个更清洁(更简单)的解决方案。
从你的最后几行,你说的是想要评测这个方法。一般来说,很少想在处理链的中间只介绍一个微小的方法。话虽如此,我可以想象一些复杂的情况可能会发生这种情况。然而,即便如此,您也应该能够自己编写代码的少数情况。
如果这是一个实际评测的问题,但你不确定如何做到这一点,因此认为唯一的方法是单独调用每个方法,这样你就可以用启动/停止计时器"包装"它,我强烈建议你研究AOP。Spring和AspectJ都非常适合AOP,因为AspectJ能够进行Spring无法完成的字节编织。
因此,使用AspectJ,您可以创建自己的评测定时器类,并在编译时将它们编织到字节码中,然后运行标准测试,但可以根据每个方法可视化您想要/需要的所有评测信息。
最棒的是,它可以避免你需要想出一些复杂的方案来产生与测试方法无关的随机测试数据。
听起来是个可怕的问题。
如果你有一个表示方法参数类型的类[],那么你不能为每个方法创建一个新的实例,并将其作为参数列表传递给方法吗?这是未经测试的:
Class[] parameterTypes = method.getGenericParameterTypes();
Object[] args = new Object[parameterTypes.length];
for (int i=0; i < parameterTypes.length; i++) {
args[i] = parameterTypes[i].newInstance(); // assuming the classes can be instantiated without params
}
method.invoke(obj, args); // I assume you've instantiated the object already