java反射获得参数是数组的方法的两种方法
2015-04-06 16:56
537 查看
在学习java中的反射时,遇到一个问题,就是通过反射方法获得一个带有数组参数的方法时,会报一个参数不对的错误。例如我是用main方法做的测试
运行后会报错:
java.lang.IllegalArgumentException: wrong number of arguments
即参数个数异常。
后来经过查资料,了解到,原来是在method.invoke方法的定义,在java1.4之前的定义是
public Object invoke(Object obj, Object[] args)
而在1.5以后(本人jdk8),其定义为
public Object invoke(Object obj, Object... args)
这样在传参数是,我们传递的数字就被解析成了一个一个的参数,即["1","2"]就变成了“1”,“2”;
而main方法只有一个数值参数,所以会报错。
所以,该问题的解决办法有二:
其一:
methodMain.invoke(null, new Object[]{new String[]{"1","2"}});
这样,String[] 就作为一个参数存在了。
其二:
methodMain.invoke(null, (Object)new String[]{"1","2"});
这样也是将String[]视作一个对象的存在,也就是一个参数了。
好了,通过这两个方法,这个问题就解决了。
Class clazz = Class.forName("test.math.MainTest"); Method methodMain = clazz.getMethod("main", String[].class); methodMain.invoke(null, new String[]{"1","2"});
运行后会报错:
java.lang.IllegalArgumentException: wrong number of arguments
即参数个数异常。
后来经过查资料,了解到,原来是在method.invoke方法的定义,在java1.4之前的定义是
public Object invoke(Object obj, Object[] args)
而在1.5以后(本人jdk8),其定义为
public Object invoke(Object obj, Object... args)
这样在传参数是,我们传递的数字就被解析成了一个一个的参数,即["1","2"]就变成了“1”,“2”;
而main方法只有一个数值参数,所以会报错。
所以,该问题的解决办法有二:
其一:
methodMain.invoke(null, new Object[]{new String[]{"1","2"}});
这样,String[] 就作为一个参数存在了。
其二:
methodMain.invoke(null, (Object)new String[]{"1","2"});
这样也是将String[]视作一个对象的存在,也就是一个参数了。
好了,通过这两个方法,这个问题就解决了。
相关文章推荐
- 使用JAVA的反射机制反射带有数组参数的私有方法
- 使用JAVA的反射机制反射带有数组参数的私有方法
- wrong number of arguments,java方法反射时数组参数的坑
- Java基础---基础加强---增强for循环、自动拆装箱及享元、枚举的作用、实现带有构造方法、透彻分析反射的基础_Class类、成员变量的反射、数组参数的成员方法进行反射、数组的反射应用
- java通过反射+javassist获得方法所有信息(返回值、方法名、参数类型列表、参数列表)
- Java基础---基础加强---增强for循环、自动拆装箱及享元、枚举的作用、实现带有构造方法、透彻分析反射的基础_Class类、成员变量的反射、数组参数的成员方法进行反射、数组的反射应用
- wrong number of arguments,java方法反射时数组参数的坑
- java中获得文件流的两种方法
- 在java方法参数位置调用void方法,确定JAVA中void方法被成功调用--反射调用
- Java利用反射来获取一个方法的 范型化参数 Vector<Integer>的类型
- java反射中两种方法的不同(反射能否实现对类的私有方法的调用)
- * java 中的数组 对象数组 以及main方法中的参数 x y不用中间参数实现交换
- [转]Java获得键盘输入的两种方法
- 用javascript获得地址栏参数的两种方法
- JAVA本地方法调用(2)数组参数传递
- Java利用反射来获取一个方法的 范型化参数 Vector<Integer>的类型
- javascript获得地址栏参数的两种方法
- 在Java中按字节获得字符串长度的两种方法
- * java 中的数组 对象数组 以及main方法中的参数 x y不用中间参数实现交换
- * java 中的数组 对象数组 以及main方法中的参数 x y不用中间参数实现交换