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)