反射:使用任意数量的参数获取方法并使用它

时间:2018-04-17 06:08:54

标签: java reflection

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

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
  4. 通过反思,我尝试使用此方法,并遵循#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);可以正常工作。

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

1 个答案:

答案 0 :(得分:1)

您需要知道函数的确切签名(通过文档查看),例如,它可能需要Object类型的参数的变量列表,或者它可能被重载,但参数类型可能不是{{1} }和String

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

在你的情况下,应该是:

(Object)