我想使用我使用的第 3 方包中的方法。这是签名:
java.lang.String buildMenuPath(java.lang.Object... objects);
该方法可以按如下方式使用(仅举几例):
-
buildMenuPath(1,1,1) //3 ints
-
buildMenuPath("str",1,1) // 1 string 2 ints
-
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/