黑马程序员技术交流社区

标题: 关于java.lang.reflect 类 Array [打印本页]

作者: 刘岩喜    时间: 2012-9-11 21:59
标题: 关于java.lang.reflect 类 Array
本帖最后由 刘岩喜 于 2012-9-11 23:17 编辑

其中方法newInstance,api里是下面那样解释的,但是不是很明白“ 如果 componentType 表示一个非数组类或接口 ”这句话

public static Object newInstance(Class<?> componentType, int... dimensions)
                                                                     throws IllegalArgumentException,NegativeArraySizeException                                                          


创建一个具有指定的组件类型和维度的新数组。如果 componentType 表示一个非数组类或接口,则新数组具有 dimensions.length 维度,并且将 componentType 作为其组件类型。如果 componentType 表示一个数组类,则新数组的维数等于 dimensions.length 和 componentType 的维数的总和。在这种情况下,新数组的组件类型为 componentType 的组件类型。

谢谢大家啦!



作者: 张 涛    时间: 2012-9-11 22:52
首先按照对API中文字的理解,应该是这样:
//如果参数class是数组,那么会返回一个原类型数组,维数是原先的维数加上后面的参数个数
//如果参数class不是数组,那么会返回一个原类型数组,维数是后面的参数个数

那么我们来验证,先看第一段代码:
  1. int[] array;
  2.             String s;
  3.             Object o;
  4.            
  5.             array = new int[]{2,3};//数组类
  6.                 o = Array.newInstance(array.getClass(), 1);
  7.                 System.out.println(o.getClass().getName());
  8.                
  9.             s = "aaa";//非数组类
  10.             o = Array.newInstance(s.getClass(), 1);
  11.                 System.out.println(o.getClass().getName());
复制代码
结果是:
[[I
[Ljava.lang.String;先解释一下,结果是什么意思。这里打印出的是class的名字,"["表示是数组,I表示是int型,两个“[”表示是二维数组,“L”表示class或Interface,这里后面又给了是String类。
那就好理解了,第一个打印出的是二维的int型数组,第二个打印的是一维的String数组。
是因为第一个数组,原先是int型的一维数组,加上后面参数的个数,注意,参数个数是指class参数后的int型参数的个数,这里是一个,所以是二维的int型数组。
第二个原先不是数组,按照非数组处理,会变成数组,维数是后面参数的个数,这里是一个,所以是String类型的一维数组。

如果还不明白,改一下代码,再看一下结果,这个就不详细说了,相信已经懂了。
代码:
  1. array = new int[]{2,3};//数组类
  2.                 o = Array.newInstance(array.getClass(), 1, 1);//int型参数个数是2
  3.                 System.out.println(o.getClass().getName());
  4.                
  5.             s = "aaa";//非数组类
  6.             o = Array.newInstance(s.getClass(), 1, 1);//int型参数个数是2
  7.                 System.out.println(o.getClass().getName());
复制代码
结果:
[[[I
[[Ljava.lang.String;
一个三维的int型数组;一个二维的String数组。
作者: 刘岩喜    时间: 2012-9-11 23:16
张 涛 发表于 2012-9-11 22:52
首先按照对API中文字的理解,应该是这样:
//如果参数class是数组,那么会返回一个原类型数组,维数是原先 ...

很明白,以前是走进了一个误区,我把新数组的维度当场数组的lenght了,谢谢




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