【问题标题】:Reflection: get the method with arbitrary number of arguments and use it as such [duplicate]反射:获取具有任意数量参数的方法并将其用作[重复]
【发布时间】:2018-04-17 06:08:53
【问题描述】:

我想使用我使用的第 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

通过反思,我尝试获取此方法并遵循用法 #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); 就可以了。

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

【问题讨论】:

  • 可变参数是编译器完成的语法糖。就 JVM 以及反射而言,该方法的签名是 buildMenuPath(Object[] objects),所以这就是您应该寻找的方法。
  • 在尝试 #2 中尝试 method.invoke(myObj, new Object[] {new Object[] {"Window", i}})。并查看How to work with varargs and reflection
  • @saka1029 谢谢 - 问题是我动态构造了pathArr,所以我不会(轻松地)知道我打电话给.invoke时我有多少个参数想打电话给

标签: java reflection


【解决方案1】:

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

最后,在调用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.lang.String buildMenuPath(java.lang.Object... objects);
  • 对不起,我错过了。调用 Invoke() 时,您应该将数组转换为 (Object)
  • @oviuan 谢谢。铸造解决了这个问题,正如重复链接中的答案所说。如果您编辑您的答案以澄清我会赞成并接受它。谢谢
  • 感谢@Adelin,添加了编辑。再次抱歉错过签名行:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-16
  • 1970-01-01
  • 2016-07-02
  • 2016-02-07
  • 2011-12-18
  • 1970-01-01
  • 2010-10-03
相关资源
最近更新 更多