[超级通道 : Java反射学习系列-绪论]
java.lang.reflect.Array类提供了通过静态方法来动态创建和访问Java数组的操作。
java.lang.reflect.Array提供以下几类静态方法操作:
示例代码如下:
/**
* java.lang.reflect.Array示例
* Created by 韩超 on 2018/2/24.
*/
public class ReflectArrayDemo {
private final static Logger LOGGER = Logger.getLogger(ReflectArrayDemo.class);
/**
* Title: java.lang.reflect.Array示例
* @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.setXxxx和Array.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)