【问题标题】:Java method invocation with list使用列表调用 Java 方法
【发布时间】: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

Exception after running code

我的问题是如何通过仅在 executeMethod 函数中更改代码来使用正确类型的参数调用方法,该参数类型可以是 []Integer(json 中的第二个参数的情况)。

【问题讨论】:

  • 创建一个合适的对象来表示您的参数/预期组合(或者更好的是,使用像 Spock 这样的内置支持参数化测试的合理测试框架)。
  • 您是否尝试过搜索如何将 ArrayList 转换为数组?
  • @kaya3 是的,这就是我想要的,自动转换该数组列表,与第一个 args [1,2,3] 发生的情况相同
  • ArrayList 永远不会自动转换为数组,您必须自己编写代码来转换它。
  • 我被这个问题困住了,如何将arraylist转换为可以正确传递给函数参数的数组,这与在函数executeMethod中预测其他类型相同,但我怎么能更改代码以使其预测数组

标签: java


【解决方案1】:

您需要学习编程的基础知识。当你有一个函数时,几乎在任何语言中,函数都需要参数。

例如,

function makeCookies(flour, sugar, water){}

现在如果你打电话给makeCookies(brick, broken_glass, battery_acid) 当然makeCookies 将不起作用。你必须给它一些flour类型的东西,sugar类型的东西,和water类型的东西。

我希望你认真对待这个例子。这是你不理解的编程方面。一旦你理解了 cookie 的比喻,你就会明白你的问题。您尝试将ArrayList 作为参数传递,但是您的函数需要一个整数因为你是这样写的!这不是什么大谜!如果您希望您的函数正常工作,请将其所需的参数更改为ArrayList!或者,如果您需要一个用于Integer[] 和一个用于ArrayList 的函数,请创建另一个函数。

【讨论】:

  • 异常说没有用参数java.util.ArrayList找到这样的方法,方法fun被声明接受list []整数或3个整数作为参数,我的问题是我如何制作该方法调用适用于 Java.util.ArrayList 或将其视为 []Integer
  • 这不是声明函数接受arraylist的重点,我希望它将arraylist转换为所需的参数类型,与第一个args [1,2,3]相同,之后是arraylist从json文件中读取它,然后使用executeMethod函数中的循环转换为(Integer,Integer,Integer),第二个args [[1,2,0]],我希望它被视为[]Integer
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-25
  • 1970-01-01
  • 1970-01-01
  • 2018-12-24
  • 1970-01-01
  • 1970-01-01
  • 2018-04-17
相关资源
最近更新 更多