1、数组反射的特点
(1)具有相同维数和元素类型的数组属于同一个类型,即具有相同的Class实例对象 (2)代表数组的Class实例对象的getSuperClass()方法返回的父类为Object类对应的Class (3)基本类型的一维数组可以被当做Object类型使用,不能当做Object[]类型使用,非基 本类型的一维数组,既可以当做Object类型使用,又可以当做Object[]类型使用 |
例一:证明具有相同维数和元素类型的数组属于同一个类型,即具有相同的Class实例对象
@Test public void test1(){ int[]arr1=new int[2];//创建一个大小为2的整数型数组 int[]arr2=new int[5];//创建一个大小为5的整数型数组 String[]arr3=new String[2];//创建一个大小为2的String数组 int[][]arr4=new int[2][3];//创建一个二维数组 //判断维数相同且数据类型相同的数组是否属于同一个Class System.out.println(arr1.getClass()== arr2.getClass()); } |
运行结果:true
如果让arr1与arr3向比较如下:
System.out.println(arr1.getClass()== ar3.getClass()); |
此时编译不通过,会出现
TicketDemo.java:11: 不可比较的类型:java.lang.Class<capture#824 of ? extends int []> 和 java.lang.Class<capture#995 of ? extends java.lang.String[]> System.out.println(arr1.getClass()== arr3.getClass()); ^ |
如果让arr1与arr4向比较如下:
System.out.println(arr1.getClass()== ar4.getClass()); |
此时编译不通过,会出现
不可比较的类型:java.lang.Class<capture#283 of ? exten []> 和 java.lang.Class<capture#456 of ? extends int[][]> System.out.println(arr1.getClass()== arr3.getClass()); ^ |
所以从上面三个案例中可以证明维数和元素类型的数组只用同时相同时,才属于同一个类型,即具有相同的Class实例对象,有一个不相同,就不是同一个类型。
例二:证明代表数组的Class实例对象的getSuperClass()方法返回的父类为Object类对应的Class
@Test public void test2(){ int[]arr1=new int[2];//创建一个大小为2的整数型数组 int[]arr2=new int[5];//创建一个大小为5的整数型数组 String[]arr3=new String[2];//创建一个大小为2的String数组 int[][]arr4=new int[2][3];//创建一个二维数组 System.out.println(arr1.getClass().getSuperclass().getName());System.out.println(arr3.getClass().getSuperclass().getName()); } |
运行结果入下:
java.lang.Object java.lang.Object |
例三:基本类型的一维数组可以被当做Object类型使用,不能当做Object[]类型使用,非基 本类型的一维数组,既可以当做Object类型使用,又可以当做Object类型使用
(1)基本类型
@Test public void test3(){ int[]arr1=new int[]{1,3};//创建一个大小为2的整数型数组 String[]arr3=new String[]{"黑马_1","黑马_2"};//创建一个大小为2的String数组 Object intObj=arr1;//把数组arr1赋值给Object System.out.println(intObj); } |
运行结果:[I@73a34b
如果有下面的代码:
Object[] intObjs=arr1;//把数组arr1赋值给Object |
上面的代码编译不能通过:cannot convert from int[] to Object[]
从上面的案例可以看出基本数据类型可以被当做Object类型使用,但是不能当做Object类型使用
(2)非基本类型
@Test public void test4(){ String[]arr3=new String[]{"黑马_1","黑马_2"};//创建一个大小为2的String数组 Object stringObj=arr3;//把数组arr1赋值给Object Object[] stringObjs=arr3;//把数组arr1赋值给Objectcannot Object stringObje=arr3;//把数组arr3赋值给Object System.out.println(stringObj); System.out.println(stringObjs); } |
运行结果:[Ljava.lang.String;@9ced8e
[Ljava.lang.String;@9ced8e
从上面可以看出,如果不是基本数据类型的话,既可以当做Object类型使用,又可以当做Object类型使用
2、Arrays.asList()方法处理int[]和String[]时的差异
@Test public void test5(){ int[]arr1=new int[]{1,3};//创建一个大小为2的整数型数组 String[]arr3=new String[]{"黑马_1","黑马_2"};//创建一个大小为2的String数组 System.out.println(Arrays.asList(arr1));//把整型数组转化成List集合 System.out.println(Arrays.asList(arr3));//把String数组转化成List集合 } |
运行结果如下:[[I@c24c0]
[黑马_1, 黑马_2]
为什么整型数组转化成List集合后打印的结果是[[I@c24c0],而不是[1,3]呢?而对于String则可以输出想要的结果呢?
我们知道在JDK1.4之前后Arrays中的asList(Object[]obj),在JDK1.5后Arrays中的asList(T...a),接收的可变参数,当传入参数时,为了兼容性,它首先看JDK1.4是否可以运行,例如,对于整型,他首先传入,而JDK1.4之前是接收的Object类型的,所以用JKD1.5的运行了,对于整型,它把整个整型数组当做一个对象了。而String类型的就可以传入JDK1.4.符合Object。
3、对数组进行反射
Java中有一个类Array,Array 类提供了动态创建和访问 Java 数组的方法
public static Object get(Object array,int index) 返回指定数组对象中索引组件的值 其中:array- 数组 index- 索引 public static void set(Object array,int index,Object value) 将指定数组对象中索引组件的值设置为指定的新值 其中: array- 数组 index- 数组内部的索引 value- 索引组件的新值 |
例如:
@Test public void test6(){ int[]arr1=new int[]{1,3};//创建一个大小为2的整数型数组 String[]arr3=new String[]{"黑马_1","黑马_2"};//创建一个大小为2的String数组 //如果传入的是数组 print(arr3); //如果是字符串 print("aaa"); } public void print(Object obj){ //获取Object的Class对象 Class cl=obj.getClass(); if(cl.isArray()){//判断是否为数组,如果是数组,遍历 for(int i=0;i<Array.getLength(obj);i++){ System.out.println(Array.get(obj, i)); } }else{//如果不是数组,直接打印 System.out.println(obj); } } |
运行结果:黑马_1
黑马_2
aaa
上面的知识点更好的解释了在反射main方法时,为什么传进一个数组,他会拆分的问题了