Java Method.invoke() 抛出 IllegalArgumentException:参数类型不匹配

fri*_*erg 0 java illegalargumentexception

我正在尝试使用参数类型调用静态方法Object[]。当我调试时,正确的方法被识别出来,我输入的参数类型在我看来是正确的类型。

public String convertToJSFunction(Method method, Object[] params) {

    String function = method.getName();

    for (Method m : JavaToJS.class.getDeclaredMethods()) {
        if (m.getName().equals(function))
            try {
                return (String) m.invoke(null,params);
            } catch (IllegalAccessException e) {
                e.printStackTrace();
                return null;
            } catch (InvocationTargetException e) {
                e.printStackTrace();
                return null;
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
                return null;
            }
    }

    return null;
}
Run Code Online (Sandbox Code Playgroud)

JavaToJS只有静态方法。调试后,m我试图调用的是这个方法:

public static String setRegionNumber(Object[] params)
Run Code Online (Sandbox Code Playgroud)

会抛出一个IllegalArgumentException: argument type mismatch. 这怎么可能?

And*_* R. 5

我猜你在打电话

Method setRegionNumber=...; // "setRegionNumber" Method
Object[] params=...; // your Object-Array Parameter
convertToJSFunction(setRegionNumber, params);
Run Code Online (Sandbox Code Playgroud)

但你需要做的是

Method setRegionNumber=...; // "setRegionNumber" Method
Object[] params=...; // your Object-Array Parameter
convertToJSFunction(setRegionNumber, new Object[] { params });
Run Code Online (Sandbox Code Playgroud)

这是因为Method.invoke期望被调用方法的参数列表作为对象数组。因此,如果您直接传递对象数组,那么它会将其解释为参数列表。所以如果你有一个Object[]参数,你需要像任何其他参数一样将它包装在一个对象数组中。