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方法時,爲什麼傳進一個數組,他會拆分的問題了