java - 为什么在调用调用方法(JAVA)时出现“错误数量的参数”异常
问题描述
我正在尝试在 java 中调用具有反射的方法,但是当我调用调用方法时出现异常。这是我的代码:
public void start() {
try {
ServerSocket server = new ServerSocket(port);
while(true) {
Socket s = server.accept();
ObjectInputStream in = new ObjectInputStream(s.getInputStream());
Class<?> myClass = Class.forName(vmi.getClass().toString().split(" ")[1]);
ArrayList<Object> array = new ArrayList();
Constructor<?> cons = myClass.getConstructor(new Class<?>[] {});
String method = null;
for(Method m : myClass.getMethods()) {
method = in.readObject().toString();
if(m.getName().equals(method)) {
Type return_type = m.getGenericReturnType();
for(Type types: m.getGenericParameterTypes()) {
array.add(in.readObject());
}
System.out.println(return_type);
if (return_type.toString().equals("void")) {
m.invoke(vmi, (Object)array);
}
break;
}
}
}
} catch (IOException | ClassNotFoundException | NoSuchMethodException
| SecurityException | IllegalAccessException
| IllegalArgumentException | InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("Skeleton Exception "+ e.toString());
}
}
这是一个例外:
java.lang.IllegalArgumentException:参数数量错误
我也尝试用空对象调用该方法,异常继续
m.invoke(vmi, new Object(), new Object());
顺便说一句,变量vmi和port是在构造函数中初始化的。
解决方案
该Method.invoke
方法的签名是:
public Object invoke(Object obj, Object... args)
这是语法糖(如果你没有传递可变参数):
public Object invoke(Object obj, Object[] args)
但是,您传递(Object,Object)
-> this 会将第二个对象作为可变参数的单个参数,因此编译器会将您的调用转换为m.invoke(vmi, new Object[] { array })
.
使您的代码复杂化的事实是您有一个名为 的变量array
,但它的类型实际上是ArrayList
,它不是数组。
您可以将代码更改为:
m.invoke(vmi, array.toArray());
这会将您的参数作为整个 varargs 参数args
而不是作为 varargs 数组中的单个元素传递。
推荐阅读
- admin-on-rest - 身份验证提供者 | 我可以在编辑 localStorage 变量的角色之间切换
- assembly - 移位和旋转操作不适用于 8086 培训套件,为什么?
- python-3.x - 未找到 OSError tsv
- javascript - 将 .ts 文件导入 .js 文件时出错
- raspberry-pi - 从青草中获取覆盆子的温度
- apache-nifi - Nifi:在企业代理环境中使用 Azure 事件中心
- android - 我对第二个 Activity 中的一系列代码有疑问
- swift - 将 Firebase .value 转换为 NSDecimal - Swift
- javascript - 如何获得信使中使用的“竖起大拇指”的可点击“id”?
- nlp - 如何回答大文件中的问题?