【发布时间】:2021-04-18 03:17:20
【问题描述】:
我正在尝试使用从 JSON 文件中提取的参数(函数参数)运行在 Java 类中声明的函数。
Java 代码:
class TestRunner {
public static void main(String args[]) {
TestRunner testRunner = new TestRunner();
try {
String path = (TestRunner.class.getResource("tests2.json")).getPath();
ObjectMapper mapper = new ObjectMapper();
List<Map<String, Object>> myObjects = mapper.readValue(Paths.get(path).toFile(),
new TypeReference<List<Map<String, Object>>>() {
});
ArrayList<Integer> list = new ArrayList<>();
for (Map<String, Object> map : myObjects) {
ArrayList arr = (ArrayList) map.get("args");
System.out.println(new TestRunner().executeMethod(testRunner, "fun", arr.toArray()));
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
public int fun(Integer[] arr) {
int sum = 0;
for (int i = 0; i < arr.length; i++) {
sum = sum + arr[i];
}
System.out.println(sum);
return sum;
}
public int fun(Integer a, Integer b, Integer c) {
return a + b + c;
}
public static Object executeMethod(Object objet, String methodName, Object[] parameters) throws Exception {
Object result;
Class[] typeParameters = null;
if (parameters != null) {
typeParameters = new Class[parameters.length];
for (int i = 0; i < parameters.length; ++i) {
typeParameters[i] = parameters[i].getClass();
}
}
Method m = objet.getClass().getMethod(methodName, typeParameters);
if (Modifier.isStatic(m.getModifiers())) {
result = m.invoke(null, parameters);
} else {
result = m.invoke(objet, parameters);
}
return result;
}
}
JSON 文件内容:
[
{
"args": [1, 2, 3],
"expected": 6
},
{
"args": [[1, 2, 0]],
"expected": 3
}
]
第一个参数可以正常工作,但是第二个参数会抛出异常,该异常应该被视为 Java 中的整数列表,但它被传递给方法调用,类型为:java.util.ArrayList
我的问题是如何通过仅在 executeMethod 函数中更改代码来使用正确类型的参数调用方法,该参数类型可以是 []Integer(json 中的第二个参数的情况)。
【问题讨论】:
-
创建一个合适的对象来表示您的参数/预期组合(或者更好的是,使用像 Spock 这样的内置支持参数化测试的合理测试框架)。
-
您是否尝试过搜索如何将 ArrayList 转换为数组?
-
@kaya3 是的,这就是我想要的,自动转换该数组列表,与第一个 args [1,2,3] 发生的情况相同
-
ArrayList 永远不会自动转换为数组,您必须自己编写代码来转换它。
-
我被这个问题困住了,如何将arraylist转换为可以正确传递给函数参数的数组,这与在函数executeMethod中预测其他类型相同,但我怎么能更改代码以使其预测数组
标签: java