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