奇怪的java.lang.IllegalArgumentException异常



我有这段代码,它检索一个方法并试图调用它,但抛出一个java.lang.IllegalArgumentException: wrong number of arguments异常。您可以看到,由于if,我最终调用的方法保证是一个单参数方法。那么,为什么会出现这个异常呢?

    ClassLoader classLoader = ClassLoader.getSystemClassLoader();
    byte[] data = getData();
    try {
        Class<?> clazz = classLoader.loadClass(className);
        Method[] methods = clazz.getMethods();
        Method theMethod = null;
        for (Method m : methods) {
            Class<?>[] parameterTypes = m.getParameterTypes();
            if (m.getName().equals("parseFrom")
                && parameterTypes.length == 1
                && parameterTypes[0].getName().equals("com.google.protobuf.ByteString"))
            {
                theMethod = m;
                break;
            }
        }
        theMethod.invoke(ByteString.copyFrom(data));
    } catch (Exception e) {
        e.printStackTrace();
    }

注意Method#invoke()的声明

public Object invoke(Object obj, Object... args)
              throws IllegalAccessException,
                     IllegalArgumentException,
                     InvocationTargetException

,其中参数为

obj -从
调用底层方法的对象Args -用于方法调用的参数

theMethod.invoke(ByteString.copyFrom(data));

您正在使用ByteString.copyFrom(..)的结果作为调用方法的对象,而没有任何作为方法参数。

方法method.invoke将调用该方法的对象作为其第一个参数。其余的参数传递给该方法。您只是在传递要传递给方法的参数。

如果你试图调用一个静态方法,传递null作为目标:

theMethod.invoke(null, ByteString.copyFrom(data));

如果你想创建一个对象,然后调用它的方法,首先创建对象,然后传递它:

theMethod.invoke(theObject, ByteString.copyFrom(data));

相关内容

  • 没有找到相关文章

最新更新