泛型 - 即时创建数据

时间:2012-01-30 20:34:59

标签: java generics reflection types

这是一个复杂的问题,我很难解释,所以我提前做出了道歉。

想象一下调用另一个项目方法的应用程序。我需要一种生成数据以匹配参数列表的方法。显然,如果参数类型属于我无法生成的某个类,那么它应该失败但是如果它是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
}

2 个答案:

答案 0 :(得分:1)

我想也许问题应该是为什么你需要这样做。也许如果您解释了您的使用/业务案例,我们可以提供更清洁(更简单)的解决方案。

从最后几行开始,您谈到的是想要分析方法。一般来说,很少想要在处理链的中间只分析一个小的微小方法。话虽如此,我可以想象一些可能发生这种情况的复杂情况。但是,即便如此,也应该是少数几种能够自己编码的情况。

如果是实际分析的问题,但你不知道该怎么做,并因此觉得唯一的方法是单独调用每个方法,这样你就可以用启动/停止计时器“包裹”它,我强烈建议调查AOPSpringAspectJ都非常适合AOP,AspectJ能够进行Spring无法完成的字节编织。

因此,使用AspectJ,您将能够创建自己的分析计时器类,并在编译时将它们编织到字节代码中,然后运行标准测试,但可视化您想要/需要的所有分析信息 - 方法基础。

最重要的是,它可以避免你需要提出一些复杂的方案来生成与被测试方法无关的随机测试数据。

答案 1 :(得分:0)

听起来像是一个可怕的问题。

如果你有类[]表示方法的参数类型,那么你不能创建每个的新实例并将其作为参数列表传递给方法吗?这是未经测试的:

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