gpt4 book ai didi

java - 反射:获取具有任意数量参数的方法并按原样使用它

转载 作者:行者123 更新时间:2023-12-02 11:21:43 25 4
gpt4 key购买 nike

我想使用我使用的第 3 方包中的方法。这是签名:

java.lang.String buildMenuPath(java.lang.Object... objects);

该方法可以按如下方式使用(仅举几例):

  1. buildMenuPath(1,1,1) //3 ints
  2. buildMenuPath("str",1,1) // 1 string 2 ints
  3. buildMenuPath("str",1) // 1 string 1 int

通过反射(reflection),我尝试获取这个方法并遵循用法#2和#3。

尝试#1,获取我将使用的确切签名 ( String.class, Integer.class )

ArrayList pathArr = new ArrayList();
pathArr.add("Window");
pathArr.add(i);
Method method = myObj.getClass().getMethod("buildMenuPath",String.class, Integer.class);
method.invoke(myObj,pathArr.toArray())
  • 抛出:java.lang.NoSuchMethodException

尝试#2,获取任意参数方法:

ArrayList pathArr = new ArrayList();
pathArr.add("Window");
pathArr.add(i);
Method method = myObj.getClass().getMethod("buildMenuPath",Object[].class);
method.invoke(myObj,pathArr.toArray())
  • 看起来它获取了方法但抛出:java.lang.IllegalArgumentException

但是如果我手动调用 myObj.buildMenuPath("Window",6);它有效。

如何通过反射来解决这个问题?

最佳答案

您需要知道函数的确切签名(查看文档),例如,它可能采用对象类型参数的变量列表,或者它可能被重载,但参数类型可能不是String int

最后,在调用 Invoke() 时,将参数数组强制转换为 (Object)

就您而言,应该是:

ArrayList pathArr = new ArrayList();
pathArr.add("Window");
pathArr.add(i);
Method method = myObj.getClass().getMethod("buildMenuPath",Object[].class);
method.invoke(myObj,(Object)pathArr.toArray())

关于java - 反射:获取具有任意数量参数的方法并按原样使用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49871006/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com