zoukankan      html  css  js  c++  java
  • Java反射04 : 通过Array动态创建和访问Java数组

    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)
  • 相关阅读:
    前端调用后台接口下载word文档的两种方法
    Layui form表单提交注意事项
    JavaScript_Util_01
    心理
    小例子
    SQL分割字符串
    绘制10种不同颜色的散点图
    绘制散点图
    subplot的使用
    绘制正弦余弦
  • 原文地址:https://www.cnblogs.com/Reverse-xiaoyu/p/11837826.html
Copyright © 2011-2022 走看看