java.lang.reflect.Array类提供了通过静态方法来动态创建和访问Java数组的操作。
本文转载自:https://blog.csdn.net/hanchao5272/article/details/79416263
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 class ReflectArrayDemo {
5 private final static Logger LOGGER = Logger.getLogger(ReflectArrayDemo.class);
6
7 /**
8 * <p>Title: java.lang.reflect.Array示例</p>
9 */
10 public static void main(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 array
26 //因为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/long
58 */
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.getXxxx
15 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, int length)
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, int index, Object value)
2 public static native Object get(Object array, int index)
注意:Array.set()和Array.get()是本地(native)方法,关于本地方法参考:[Java的native方法]
(http://blog.csdn.net/hanchao5272/article/details/79361922)
代码示例:
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, int index)
2 public static native void setBoolean(Object array, int index, boolean z)
3
4 public static native int getInt(Object array, int index)
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 array
5 因为array是引用类型的数组
6 */
7 //Array.setInt(array,2,120);
8 /*
9 下面语句运行报错IllegalArgumentException: Argument is not an array
10 因为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 array
2 at java.lang.reflect.Array.getInt(Native Method)
3 at pers.hanchao.reflect.array.ReflectArrayDemo.main(ReflectArrayDemo.java:48)