簡體   English   中英

調用 invoke 方法 (JAVA) 時,為什么會出現“錯誤數量的參數”異常

[英]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());

順便說一下,變量vmiport是在構造函數中初始化的。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM