java反射创建数组_Java反射04 : 通过Array动态创建和访问Java数组

本文详细介绍了如何使用Java反射中的Array类动态创建和访问Java数组,包括Array.newInstance()方法创建数组,Array.set()和Array.get()方法设置和获取数组元素,以及Array.setXxxx()和Array.getXxxx()方法对基本类型数组的操作。通过示例代码展示了这些方法的具体用法。
摘要由CSDN通过智能技术生成

java.lang.reflect.Array类提供了通过静态方法来动态创建和访问Java数组的操作。

1.主要的静态方法

java.lang.reflect.Array提供以下几类静态方法操作:

Array.newInstance() :创建引用类型的数组

Array.set()和Array.get() :根据索引,设置和获取指定数组(所有类型的数组)元素的值。

Array.setXxxx()和Array.getXxxx() :根据索引,设置和获取指定数组(基本数据类型的数组)元素的值。

Xxxx :8中基本数据类型 boolean/char/float/double/byte/int/short/long

示例代码如下:

1 /**

2 * java.lang.reflect.Array示例3 */

4 public classReflectArrayDemo {5 private final static Logger LOGGER = Logger.getLogger(ReflectArrayDemo.class);6

7 /**

8 *

Title: java.lang.reflect.Array示例

9 */

10 public static voidmain(String[] args){11 /*

12 static Object newInstance(Class> componentType, int dimensions)13 */

14 LOGGER.info("利用Array.newInstance创建一维数组");15 //利用Array.newInstance创建一维数组

16 int rows = 3;17 int cols = 2;18 Integer[] array = (Integer[]) Array.newInstance(Integer.class,rows);19 //static void set(Object array, int index, Object value)20 //通过Array.set设置数组的值

21 LOGGER.info("通过Array.set设置数组的值");22 Array.set(array,0,110);23 Array.set(array,1,119);24 Array.set(array,2,120);25 //下面语句运行报错IllegalArgumentException: Argument is not an array26 //因为array是引用类型的数组27 //Array.setInt(array,2,120);28 //static Object get(Object array, int index)29 //通过Array.get获取数组的值

30 LOGGER.info("通过Array.get获取数组的值");31 for(int i = 0; i < 3; i++) {32 LOGGER.info(Array.get(array,i));33 }34

35 /*

36 static Object newInstance(Class> componentType, int length)37 */

38 LOGGER.info("利用Array.newInstance创建多维数组");39 //利用Array.newInstance创建多维数组

40 Double[][] arraymn = (Double[][]) Array.newInstance(Double.class,rows,cols);41 Array.set(arraymn[0],0,1D);42 Array.set(arraymn[0],1,2D);43 Array.set(arraymn[1],0,11D);44 Array.set(arraymn[1],1,12D);45 Array.set(arraymn[2],0,21D);46 Array.set(arraymn[2],1,22D);47 for(Double[] arrayn : arraymn ){48 for(Double item : arrayn){49 LOGGER.info(item);50 }51 }52

53 /*

54 基本类型数组操作55 static void setInt(Object array, int index, int i)56 static double getDouble(Object array, int index)57 8中基本类型:boolean/char/float/double/byte/int/short/long58 */

59 LOGGER.info("Array.setXxxx和Array.getXxxx");60 int[] ints = new int[3];61 LOGGER.info("通过Array.setInt设置int基本数据类型的数据");62 Array.setInt(ints,0,110);63 Array.setInt(ints,1,110);64 Array.setInt(ints,2,110);65 for(int i = 0; i < 3; i++) {66 LOGGER.info("通过Array.getDouble获取double基本数据类型的数据:" +Array.getDouble(ints,i));67 }68 }69 }

运行结果:

1 INFO ReflectArrayDemo:22 -利用Array.newInstance创建一维数组2 INFO ReflectArrayDemo:29 -通过Array.set设置数组的值3 INFO ReflectArrayDemo:38 -通过Array.get获取数组的值4 INFO ReflectArrayDemo:40 - 110

5 INFO ReflectArrayDemo:40 - 119

6 INFO ReflectArrayDemo:40 - 120

7 INFO ReflectArrayDemo:46 -利用Array.newInstance创建多维数组8 INFO ReflectArrayDemo:57 - 1.0

9 INFO ReflectArrayDemo:57 - 2.0

10 INFO ReflectArrayDemo:57 - 11.0

11 INFO ReflectArrayDemo:57 - 12.0

12 INFO ReflectArrayDemo:57 - 21.0

13 INFO ReflectArrayDemo:57 - 22.0

14 INFO ReflectArrayDemo:67 -Array.setXxxx和Array.getXxxx15 INFO ReflectArrayDemo:69 -通过Array.setInt设置int基本数据类型的数据16 INFO ReflectArrayDemo:74 - 通过Array.getDouble获取double基本数据类型的数据:110.0

17 INFO ReflectArrayDemo:74 - 通过Array.getDouble获取double基本数据类型的数据:110.0

18 INFO ReflectArrayDemo:74 - 通过Array.getDouble获取double基本数据类型的数据:110.0

总结:

1.Array.newInstance()

可以通过Array.newInstance()创建多维引用类型的数组,有以下两个静态方法。

注意是引用类型(因为需要参数Class> componentType决定数组类型)

1 //一维数组

2 public static Object newInstance(Class> componentType, intlength)3 //多维数组

4 public static Object newInstance(Class> componentType, int... dimensions)

代码示例:

1 Integer[] array = (Integer[]) Array.newInstance(Integer.class, rows);2 Double[][] arraymn = (Double[][]) Array.newInstance(Double.class, rows, cols);

2,Array.set()和Array.get()

可以通过Array.set()和Array.get()进行数组元素的取值和写入,可以操作引用类型数组,也可以操作基本类型数组。

set和get方法如下:

1 public static native void set(Object array, intindex, Object value)2 public static native Object get(Object array, int index)

注意:Array.set()和Array.get()是本地(native)方法,关于本地方法参考:[Java的native方法]

代码示例:

1 //引用类型数组的get和set操作

2 Integer[] array = (Integer[]) Array.newInstance(Integer.class,rows);3 Array.set(array,0,110);4 Array.get(array,i)5 //基本数据类型的get和set操作

6 int[] ints = new int[3];7 Array.set(ints,2,110);8 Array.get(ints,0)

3.Array.setXxxx()和Array.getXxxx()

可以通过Array.setXxxx()和Array.getXxxx()进行基本类型数组元素的取值和写入,引用类型数组不可用。

这里的Xxxx。指的是基本数据类型:boolean/char/float/double/byte/int/short/long。拿boolean和int举例,其静态方法如下:

1 public static native boolean getBoolean(Object array, intindex)2 public static native void setBoolean(Object array, int index, booleanz)3

4 public static native int getInt(Object array, intindex)5 public static native void setInt(Object array, int index, int i)

注意:Array.setXxxx()和Array.getXxxx()是针对基本数据类型的操作。

注意:Array.setXxxx()和Array.getXxxx()是本地(native)方法,关于本地方法参考:Java的native方法

代码示例:

1 //引用类型数组

2 Integer[] array = (Integer[]) Array.newInstance(Integer.class, rows);3 /*

4 下面语句运行报错IllegalArgumentException: Argument is not an array5 因为array是引用类型的数组6 */

7 //Array.setInt(array,2,120);

8 /*

9 下面语句运行报错IllegalArgumentException: Argument is not an array10 因为array是引用类型的数组11 */

12 //LOGGER.info(Array.getInt(array,2));

如果使用Array.setXxxx()和Array.getXxxx()会产生如下错误:

1 Exception in thread "main"java.lang.IllegalArgumentException: Argument is not an array2 at java.lang.reflect.Array.getInt(Native Method)3 at pers.hanchao.reflect.array.ReflectArrayDemo.main(ReflectArrayDemo.java:48)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值