奇怪的java.lang.IllegalArgumentException异常

奇怪的java.lang.IllegalArgumentException异常,java,reflection,Java,Reflection,我有一段代码,它检索一个方法并尝试调用它,但抛出了一个java.lang.IllegalArgumentException:参数数目错误的异常。您可以看到,我最终调用的方法保证是一个单参数方法,因为if。那么,为什么我会得到这个例外呢 ClassLoader classLoader = ClassLoader.getSystemClassLoader(); byte[] data = getData(); try { Class<?> claz

我有一段代码,它检索一个方法并尝试调用它,但抛出了一个
java.lang.IllegalArgumentException:参数数目错误的
异常。您可以看到,我最终调用的方法保证是一个单参数方法,因为
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();
    }
ClassLoader ClassLoader=ClassLoader.getSystemClassLoader();
字节[]数据=getData();
试一试{
Class clazz=classLoader.loadClass(className);
方法[]methods=clazz.getMethods();
方法theMethod=null;
用于(方法m:方法){
类[]parameterTypes=m.getParameterTypes();
if(m.getName().equals(“parseFrom”)
&¶meterTypes.length==1
&&参数类型[0].getName().equals(“com.google.protobuf.ByteString”))
{
方法=m;
打破
}
}
调用方法(ByteString.copyFrom(data));
}捕获(例外e){
e、 printStackTrace();
}
注意

参数在哪里

obj-从中调用基础方法的对象
args-用于方法调用的参数

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

请注意

参数在哪里

obj-从中调用基础方法的对象
args-用于方法调用的参数

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

请注意

参数在哪里

obj-从中调用基础方法的对象
args-用于方法调用的参数

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

请注意

参数在哪里

obj-从中调用基础方法的对象
args-用于方法调用的参数


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

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

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

theMethod.invoke(null, ByteString.copyFrom(data));
如果要创建对象,然后对其调用方法,请先创建对象,然后传递:

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

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

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

theMethod.invoke(null, ByteString.copyFrom(data));
如果要创建对象,然后对其调用方法,请先创建对象,然后传递:

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

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

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

theMethod.invoke(null, ByteString.copyFrom(data));
如果要创建对象,然后对其调用方法,请先创建对象,然后传递:

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

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

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

theMethod.invoke(null, ByteString.copyFrom(data));
如果要创建对象,然后对其调用方法,请先创建对象,然后传递:

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

其他人已经给了你答案,但是这里有一些事情需要思考:如果你没有找到方法会发生什么?其他人已经给了你答案,但是这里有一些事情需要思考:如果你没有找到方法会发生什么?其他人已经给了你答案,但是这里还有一些事情需要考虑:如果你没有找到方法会发生什么?其他人已经给了你答案,但是这里还有一些事情需要考虑:如果你没有找到方法会发生什么?不敢相信我错过了!RTFM@me。谢谢,无论如何我不敢相信我错过了!RTFM@me。谢谢,无论如何我不敢相信我错过了!RTFM@me。谢谢,无论如何我不敢相信我错过了!RTFM@me。无论如何,谢谢你