黑马程序员技术交流社区

标题: 反射时main函数传递参数的疑惑 [打印本页]

作者: 第一印象    时间: 2013-9-6 10:03
标题: 反射时main函数传递参数的疑惑
本帖最后由 第一印象 于 2013-9-9 08:13 编辑

对于main函数的反射,跟其他静态函数的反射其实是一样的,但是传参数的时候,如果参数是数组,分为两种情况,
一种是java中八大基本数据类型的数组,比如int[],byte[]等,
一种是引用类型的数组,比如String[],Integer[]等,
两者在作为参数传递的时候是有差异的,
如果是基本数据类型的数组,在调用Method类对象的invoke方法时,参数可以直接传入
但是如果是引用类型的数组,在调用Method类对象的invoke方法时,参数需要包装成一个元素而不能作为一个数组传入,比如说
强转成Object,告诉调用者这是一个参数不是一个数组,或者进行二维数组封装,调用者在取的时候,取第一个元素,因为调用的时候
会对参数解包如果是一个数组,会将数组中的每一个元素都解包出来作为一个一个单独的参数,这时候就有问题了,比如,
我调用的main方法,本来只有一个String[]类型的数组的,结果解包出来成了多个参数,就会出现参数个数不匹配的情况,

为什么引用类型的数组需要包装,而基本数据类型的数组不需要呢?

参数为基本数据类型数组的方法:
  1.         public void intArrPrint(int[] iArr){
  2.                 System.out.println("==========我是intArrPrint方法,我的长度是"+iArr.length+"==========");
  3.                 for(int i : iArr){
  4.                         System.out.println(i);
  5.                 }
  6.         }
复制代码
反射方式调用参数为基本数据类型数组的方法:
  1.                 Method intArrPrintMethod = clazz.getMethod("intArrPrint", int[].class);
  2.                 intArrPrintMethod.invoke(person, new int[]{1,4,8});
复制代码
参数为引用类型数组(String[])的main方法:
  1.                     public static void main(String[] args){
  2.         System.out.println("==========我是main方法==========");
  3.         for(String arg : args){
  4.             System.out.println(arg);
  5.         }
  6.     }
复制代码
反射方式调用参数为引用类型数组(String[])的main方法:
  1.                 Method mainMethod = clazz.getMethod("main", String[].class);
  2.                 //调用方式一
  3.                 mainMethod.invoke(null, (Object)new String[]{"张三11","李四22"});
  4.                 //调用方式二
  5.                 //mainMethod.invoke(person, new Object[]{new String[]{"张三11","李四22"}});
复制代码

作者: 黄文伯    时间: 2013-9-6 10:29
亲,如问题已解决请将分类的“未解决”改为“已解决”。
以后的问题贴也要及时更改分类哦~
作者: 辛春鹏    时间: 2013-9-6 16:41
invoke

public Object invoke(Object obj,
                     Object... args)
              throws IllegalAccessException,
                     IllegalArgumentException,
                     InvocationTargetException
对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。个别参数被自动解包,以便与基本形参相匹配,基本参数和引用参数都随需服从方法调用转换。
如果底层方法是静态的,那么可以忽略指定的 obj 参数。该参数可以为 null。

这个方法接收的第二个参数的是这么写的  Object... args  这个是可变参数类型吧 如果是int[],其中还的元素是基本数据类型,不是对象。int[]数组本身是一个对象。如果是String[]的话,其中的每一个元素都是一个对象,那么这个方法会以为传入的是许多的参数,因为方法定义时候就是可变的参数类型。我觉得如果是这样定义 public Object invoke(Object obj,
                     Object args)。就不会这样了。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2