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

[超级通道 : Java反射学习系列-绪论]

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

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

示例代码如下:

/**
 * java.lang.reflect.Array示例
 * Created by 韩超 on 2018/2/24.
 */
public class ReflectArrayDemo {
    private final static Logger LOGGER = Logger.getLogger(ReflectArrayDemo.class);

    /**
     * <p>Title: java.lang.reflect.Array示例</p>
     * @author 韩超 2018/2/24 15:42
     */
    public static void main(String[] args){
        /*
        static Object newInstance(Class<?> componentType, int dimensions)
         */
        LOGGER.info("利用Array.newInstance创建一维数组");
        //利用Array.newInstance创建一维数组
        int rows = 3;
        int cols = 2;
        Integer[] array = (Integer[]) Array.newInstance(Integer.class,rows);
        //static void set(Object array, int index, Object value)
        //通过Array.set设置数组的值
        LOGGER.info("通过Array.set设置数组的值");
        Array.set(array,0,110);
        Array.set(array,1,119);
        Array.set(array,2,120);
        //下面语句运行报错IllegalArgumentException: Argument is not an array
        //因为array是引用类型的数组
//      Array.setInt(array,2,120);
        //static Object get(Object array, int index)
        //通过Array.get获取数组的值
        LOGGER.info("通过Array.get获取数组的值");
        for(int i = 0; i < 3; i++) {
            LOGGER.info(Array.get(array,i));
        }

        /*
        static Object newInstance(Class<?> componentType, int length)
         */
        LOGGER.info("利用Array.newInstance创建多维数组");
        //利用Array.newInstance创建多维数组
        Double[][] arraymn = (Double[][]) Array.newInstance(Double.class,rows,cols);
        Array.set(arraymn[0],0,1D);
        Array.set(arraymn[0],1,2D);
        Array.set(arraymn[1],0,11D);
        Array.set(arraymn[1],1,12D);
        Array.set(arraymn[2],0,21D);
        Array.set(arraymn[2],1,22D);
        for(Double[] arrayn : arraymn ){
            for (Double item : arrayn){
                LOGGER.info(item);
            }
        }

        /*
        基本类型数组操作
        static void setInt(Object array, int index, int i)
        static double getDouble(Object array, int index)
        8中基本类型:boolean/char/float/double/byte/int/short/long
         */
        LOGGER.info("Array.setXxxx和Array.getXxxx");
        int[] ints = new int[3];
        LOGGER.info("通过Array.setInt设置int基本数据类型的数据");
        Array.setInt(ints,0,110);
        Array.setInt(ints,1,110);
        Array.setInt(ints,2,110);
        for(int i = 0; i < 3; i++) {
            LOGGER.info("通过Array.getDouble获取double基本数据类型的数据:" + Array.getDouble(ints,i));
        }
    }
}

运行结果:

2018-02-24 17:30:50 INFO  ReflectArrayDemo:22 - 利用Array.newInstance创建一维数组
2018-02-24 17:30:50 INFO  ReflectArrayDemo:29 - 通过Array.set设置数组的值
2018-02-24 17:30:50 INFO  ReflectArrayDemo:38 - 通过Array.get获取数组的值
2018-02-24 17:30:50 INFO  ReflectArrayDemo:40 - 110
2018-02-24 17:30:50 INFO  ReflectArrayDemo:40 - 119
2018-02-24 17:30:50 INFO  ReflectArrayDemo:40 - 120
2018-02-24 17:30:50 INFO  ReflectArrayDemo:46 - 利用Array.newInstance创建多维数组
2018-02-24 17:30:50 INFO  ReflectArrayDemo:57 - 1.0
2018-02-24 17:30:50 INFO  ReflectArrayDemo:57 - 2.0
2018-02-24 17:30:50 INFO  ReflectArrayDemo:57 - 11.0
2018-02-24 17:30:50 INFO  ReflectArrayDemo:57 - 12.0
2018-02-24 17:30:50 INFO  ReflectArrayDemo:57 - 21.0
2018-02-24 17:30:50 INFO  ReflectArrayDemo:57 - 22.0
2018-02-24 17:30:50 INFO  ReflectArrayDemo:67 - Array.setXxxxArray.getXxxx
2018-02-24 17:30:50 INFO  ReflectArrayDemo:69 - 通过Array.setInt设置int基本数据类型的数据
2018-02-24 17:30:50 INFO  ReflectArrayDemo:74 - 通过Array.getDouble获取double基本数据类型的数据:110.0
2018-02-24 17:30:50 INFO  ReflectArrayDemo:74 - 通过Array.getDouble获取double基本数据类型的数据:110.0
2018-02-24 17:30:50 INFO  ReflectArrayDemo:74 - 通过Array.getDouble获取double基本数据类型的数据:110.0

总结:

1.Array.newInstance()
可以通过Array.newInstance()创建多维引用类型的数组,有以下两个静态方法。
注意是引用类型(因为需要参数Class<?> componentType决定数组类型)

//一维数组
public static Object newInstance(Class<?> componentType, int length)
//多维数组
public static Object newInstance(Class<?> componentType, int... dimensions)

代码示例:

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

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

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

注意:Array.set()和Array.get()是本地(native)方法,关于本地方法参考:[Java的native方法]
(http://blog.csdn.net/hanchao5272/article/details/79361922)

代码示例:

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

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

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

public static native boolean getBoolean(Object array, int index)
public static native void setBoolean(Object array, int index, boolean z)

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

注意:Array.setXxxx()和Array.getXxxx()是针对基本数据类型的操作
注意:Array.setXxxx()和Array.getXxxx()是本地(native)方法,关于本地方法参考:Java的native方法

代码示例:

//引用类型数组
Integer[] array = (Integer[]) Array.newInstance(Integer.class, rows);
/*
下面语句运行报错IllegalArgumentException: Argument is not an array
因为array是引用类型的数组
 */
//Array.setInt(array,2,120);
/*
下面语句运行报错IllegalArgumentException: Argument is not an array
因为array是引用类型的数组
 */
//LOGGER.info(Array.getInt(array,2));

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

Exception in thread "main" java.lang.IllegalArgumentException: Argument is not an array
    at java.lang.reflect.Array.getInt(Native Method)
    at pers.hanchao.reflect.array.ReflectArrayDemo.main(ReflectArrayDemo.java:48)
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值