[英]Why am I getting PLS-00306 “wrong number or types of arguments in call” when the Hibernate looks correct?
[英]Why am I getting the "wrong number of arguments" exception when call invoke method (JAVA)
我試圖在 Java 中使用反射調用一個方法,但是當我調用 invoke 方法時出現異常。 這是我的代碼:
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)
-> 這會將第二個對象作為可變參數的單個參數,因此編譯器將您的調用轉換為m.invoke(vmi, new Object[] { array })
.
使您的代碼復雜化的事實是您有一個名為array
的變量,但它的類型實際上是ArrayList
,它不是數組。
您可以將代碼更改為:
m.invoke(vmi, array.toArray());
這會將您的參數作為整個 varargs 參數args
傳遞,而不是作為 varargs 數組中的單個元素。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.