奇怪的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。无论如何,谢谢你