簡體   English   中英

在方法調用期間將Array作為參數傳遞時出現IllegalArgumentException

[英]IllegalArgumentException when passing an Array as parameter during method invocation

我必須錯過一些非常基本的東西 當我嘗試在方法調用期間傳遞任何類型的數組時,我收到錯誤。 但是,當我這樣做時,它通常會起作用。

這是失敗的完整代碼

import java.lang.reflect.Method;

public class Main {
    public static void main(String[] args) throws Exception {

        // Normal
        MyClass.sayHello(new String[] {"StackOverflow"});

        // Reflection
        Method m = MyClass.class.getMethod("sayHello", String[].class);
        m.invoke(null, new String[]{"StackOverflow"});
    }

    static class MyClass {
        public static void sayHello(String[] args) {
            System.out.println("Hello " + args[0]);
        }
    }
}

拋出異常

Exception in thread "main" java.lang.IllegalArgumentException: argument type mismatch
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at Main.main(Main.java:11)

String...不能正常工作。

問題是要invoke的第二個參數是一個參數數組 - 您只是指定一個參數。

在大多數情況下,由於Method.invoke的第二個參數是varargs參數,但是由於您的參數已經是與Object[]兼容的數組,因此編譯器不會創建包裝器數組。 我希望你得到這樣的編譯時警告:

Main.java:11: warning: non-varargs call of varargs method with inexact argument type for
                       last parameter;
        m.invoke(null, new String[]{"StackOverflow"});
                       ^
  cast to Object for a varargs call
  cast to Object[] for a non-varargs call and to suppress this warning

您可以顯式創建包裝參數的數組,也可以將參數轉換為Object以便編譯器需要自己包裝它:

// Creates the wrapper array explicitly
m.invoke(null, new Object[] { new String[] { "StackOverflow" } });

要么

// Compiler creates the wrapper array because the argument type is just Object
m.invoke(null, (Object) new String[] { "StackOverflow" });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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