java反射之数组反射

 

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

如果让arr1arr3向比较如下:

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());

                                                  ^                                           

  如果让arr1arr4向比较如下:

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类型使用

2Arrays.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.5Arrays中的asList(T...a),接收的可变参数,当传入参数时,为了兼容性,它首先看JDK1.4是否可以运行,例如,对于整型,他首先传入,而JDK1.4之前是接收的Object类型的,所以用JKD1.5的运行了,对于整型,它把整个整型数组当做一个对象了。而String类型的就可以传入JDK1.4.符合Object

3、对数组进行反射

  Java中有一个类ArrayArray 类提供了动态创建和访问 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方法时,为什么传进一个数组,他会拆分的问题了

 

 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值