reverse_xiaoyu

忘记并不可怕,可怕的是你从来就都不知道!

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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

本文转载自:https://blog.csdn.net/hanchao5272/article/details/79416263

1.主要的静态方法

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

  1. Array.newInstance() :创建引用类型的数组
  2. Array.set()和Array.get() :根据索引,设置和获取指定数组(所有类型的数组)元素的值。
  3. Array.setXxxx()和Array.getXxxx() :根据索引,设置和获取指定数组(基本数据类型的数组)元素的值。
  4. 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)
posted on 2019-11-11 19:59  Reverse-xiaoyu  阅读(236)  评论(0编辑  收藏  举报