記錄:肖佳嘉
同步博客:筱某佳同學
最近在寫項目的時候,有一處地方使用到對象數組。起初沒有留意反射的問題,於是調用方法也就直接調用,正常傳參,然後一直報出java.lang.IllegalArgumentException異常,百度上解決問題都是說將jdk和jre改成1.7,但親測不是同一類型問題,無效。
當我將調用方法的參數改爲無參的時候,成功運行。這時候明白是肯定參數方面出現問題,於是着手於參數方面……
最終找到解決方案——在傳參的時候先用一個Object類型將對象進行包裝,直接傳會報錯。
修改後的傳參,正常運行
//調用類
public class Person {
String name ;
public void ArrayPrint(String [] s) {
System.out.println("調用成功");
}
}
public class Run {
public static void main(String[] args) throws Exception, SecurityException {
String [] s = {"1","2"};
//加載該類進入內存
Class cla = Class.forName("Test.Person");
//創建對象
Object obj = cla.newInstance();
//獲取方法對象
Method method = cla.getMethod("ArrayPrint",String[].class);
method.invoke(obj,new Object[]{s});
}
修改前的傳參,報出IllegalArgumentException 異常
public class Person {
String name ;
public void ArrayPrint(String [] s) {
System.out.println("調用成功");
}
}
public class Run {
public static void main(String[] args) throws Exception, SecurityException {
String [] s = {"1","2"};
//加載該類進入內存
Class cla = Class.forName("Test.Person");
//創建對象
Object obj = cla.newInstance();
//獲取方法對象
Method method = cla.getMethod("ArrayPrint",String[].class);
method.invoke(obj,new s);
}
}
Exception in thread "main" java.lang.IllegalArgumentException: wrong number of arguments
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at Test.Run.main(Run.java:15)