【发布时间】:2018-04-17 06:08:53
【问题描述】:
我想使用我使用的第 3 方包中的方法。这是签名:
java.lang.String buildMenuPath(java.lang.Object... objects);
该方法可以使用如下(仅举几例):
buildMenuPath(1,1,1) //3 intsbuildMenuPath("str",1,1) // 1 string 2 intsbuildMenuPath("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