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