奇怪的java.lang.IllegalArgumentException异常

时间:2014-03-16 20:51:13

标签: java reflection

我有这段代码检索一个方法并尝试调用它,但抛出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();
    }

2 个答案:

答案 0 :(得分:2)

请注意Method#invoke()

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

参数

  

obj - 从中​​调用底层方法的对象   args - 用于方法调用的参数

使用

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

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

答案 1 :(得分:1)

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

如果您尝试调用静态方法,请将null作为目标传递:

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

如果要创建对象然后在其上调用方法,首先创建对象,然后传递它:

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