一、概述
1、具有相同维数和元素类型的数组属于同一个类型,即具有相同的Class实例对象。
2、代表数组的Class实例对象的getSuperClass()方法返回的父类为Object类对应的Class。
3、基本类型的一维数组可以被当作Object类型使用,不能当作Object[]类型使用;非基本类型的一维数组,既可以当做Object类型使用,又可以当做Object[]类型使用。
4、Arrays.asList()方法处理int[]和String[]时的差异。
5、Array工具类用于完成对数组的反射操作。
java.reflect.Array获取数组长度、get值、set值等。
//对数组设置值
private static void setArrayReflectApp(Object obj) {
if(obj.getClass().isArray()){
for(int i = 0; i < Array.getLength(obj); i++){
Array.set(obj, i, i);
}
}
}
//对数组或对象进行打印
private static void arrayReflectApp(Object obj) {
if(obj.getClass().isArray()){
for(int i = 0; i < Array.getLength(obj); i++){
System.out.println(Array.get(obj, i));
}
}
else {
System.out.println(obj);
}
}
6、思考题:怎么得到数组中的元素类型?
只能得到某一个元素的具体类型:
Object[] obj =new Object[]{1,"abc"};
obj[i].getClass().getName();
二、代码说明
ArrayReflectTest.java
package staticimport.reflect;
import java.lang.reflect.Array;
import java.util.Arrays;
/***
*
* 数组与Object的关系及其反射类型
*
* 数组的反射应用
*
* @author Liu
*
*/
public class ArrayReflectTest {
public static void main(String[] args) {
int[] a1 = new int[]{1,2,3};
int[] a2 = new int[4];
int[][] a3 = new int[2][3];
int[][] a33 = new int[][]{new int[]{1,2},new int[]{3,4}};
int[][] a333 = {{1,2,3},{4,5,6},{7,8,9}};
String[] a4 = new String[]{"a","b","c"};
System.out.println(a1.getClass() == a2.getClass());//true
// System.out.println(a1.getClass() == a4.getClass());//false
// System.out.println(a1.getClass() == a3.getClass());//false
System.out.println(a1.getClass().getName());
System.out.println(a1.getClass().getSuperclass().getName());
System.out.println(a4.getClass().getSuperclass().getName());
Object obj1 = a1;
Object obj2 = a4;
// Object[] obj3 = a1;//一维基本类型数组的父类都是Object
Object[] obj4 = a3;
Object[] obj5 = a4;
System.out.println(a1);
System.out.println(a4);
//int[]的父类是Object类型而非Object[]
//先用jdk1.4语法试,发现不行然后还是用了jdk1.5语法
System.out.println(Arrays.asList(a1));//[[I@15db9742]
//String[]的父类是Object类型也是Object[]
//发现用jdk1.4语法可以
System.out.println(Arrays.asList(a4));//[a, b, c]
//二维数组
System.out.println(Arrays.asList(a33));
//二维数组
System.out.println(Arrays.asList(a333));
//数组的反射应用
arrayReflectApp(a1);
arrayReflectApp(a4);
arrayReflectApp("abc");
setArrayReflectApp(a1);
arrayReflectApp(a1);
}
//对数组设置值
private static void setArrayReflectApp(Object obj) {
if(obj.getClass().isArray()){
for(int i = 0; i < Array.getLength(obj); i++){
Array.set(obj, i, i);
}
}
}
//对数组或对象进行打印
private static void arrayReflectApp(Object obj) {
if(obj.getClass().isArray()){
for(int i = 0; i < Array.getLength(obj); i++){
System.out.println(Array.get(obj, i));
}
}
else {
System.out.println(obj);
}
}
}