本帖最后由 第一印象 于 2013-9-9 08:13 编辑
对于main函数的反射,跟其他静态函数的反射其实是一样的,但是传参数的时候,如果参数是数组,分为两种情况,
一种是java中八大基本数据类型的数组,比如int[],byte[]等,
一种是引用类型的数组,比如String[],Integer[]等,
两者在作为参数传递的时候是有差异的,
如果是基本数据类型的数组,在调用Method类对象的invoke方法时,参数可以直接传入
但是如果是引用类型的数组,在调用Method类对象的invoke方法时,参数需要包装成一个元素而不能作为一个数组传入,比如说
强转成Object,告诉调用者这是一个参数不是一个数组,或者进行二维数组封装,调用者在取的时候,取第一个元素,因为调用的时候
会对参数解包如果是一个数组,会将数组中的每一个元素都解包出来作为一个一个单独的参数,这时候就有问题了,比如,
我调用的main方法,本来只有一个String[]类型的数组的,结果解包出来成了多个参数,就会出现参数个数不匹配的情况,
为什么引用类型的数组需要包装,而基本数据类型的数组不需要呢?
参数为基本数据类型数组的方法:- public void intArrPrint(int[] iArr){
- System.out.println("==========我是intArrPrint方法,我的长度是"+iArr.length+"==========");
- for(int i : iArr){
- System.out.println(i);
- }
- }
复制代码 反射方式调用参数为基本数据类型数组的方法:- Method intArrPrintMethod = clazz.getMethod("intArrPrint", int[].class);
- intArrPrintMethod.invoke(person, new int[]{1,4,8});
复制代码 参数为引用类型数组(String[])的main方法:- public static void main(String[] args){
- System.out.println("==========我是main方法==========");
- for(String arg : args){
- System.out.println(arg);
- }
- }
复制代码 反射方式调用参数为引用类型数组(String[])的main方法:- Method mainMethod = clazz.getMethod("main", String[].class);
- //调用方式一
- mainMethod.invoke(null, (Object)new String[]{"张三11","李四22"});
- //调用方式二
- //mainMethod.invoke(person, new Object[]{new String[]{"张三11","李四22"}});
复制代码 |