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

示例代码如下:

 /**
* java.lang.reflect.Array示例
*/
public class ReflectArrayDemo {
private final static Logger LOGGER = Logger.getLogger(ReflectArrayDemo.class); /**
* <p>Title: java.lang.reflect.Array示例</p>
*/
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));
}
}
}

运行结果:

 INFO  ReflectArrayDemo:22 - 利用Array.newInstance创建一维数组
INFO ReflectArrayDemo:29 - 通过Array.set设置数组的值
INFO ReflectArrayDemo:38 - 通过Array.get获取数组的值
INFO ReflectArrayDemo:40 - 110
INFO ReflectArrayDemo:40 - 119
INFO ReflectArrayDemo:40 - 120
INFO ReflectArrayDemo:46 - 利用Array.newInstance创建多维数组
INFO ReflectArrayDemo:57 - 1.0
INFO ReflectArrayDemo:57 - 2.0
INFO ReflectArrayDemo:57 - 11.0
INFO ReflectArrayDemo:57 - 12.0
INFO ReflectArrayDemo:57 - 21.0
INFO ReflectArrayDemo:57 - 22.0
INFO ReflectArrayDemo:67 - Array.setXxxx和Array.getXxxx
INFO ReflectArrayDemo:69 - 通过Array.setInt设置int基本数据类型的数据
INFO ReflectArrayDemo:74 - 通过Array.getDouble获取double基本数据类型的数据:110.0
INFO ReflectArrayDemo:74 - 通过Array.getDouble获取double基本数据类型的数据:110.0
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)

最新文章

  1. am335x 更改调试串口
  2. JSBinding + SharpKit / 实战:转换 Stealth
  3. Mysql 更改最大连接数
  4. 【JavaScript】Javascript中的函数声明和函数表达式
  5. 20141016--for 菱形
  6. UVA 11462 Age Sort(计数排序法 优化输入输出)
  7. 数据结构(平衡树,树分治,暴力重构):WC 2014 紫荆花之恋
  8. AFNetworking GET和POST请求
  9. H3CNE实验:通过Console端口本地访问H3C设备
  10. bzoj4236 JOIOJI hash 模拟
  11. Code Review Checklist
  12. Perl IO:IO重定向
  13. 查看crontab运行状态
  14. 承接AR摄像头识别外包 AR图像识别 AR识别图像 AR识别应用外包
  15. https搭建实例
  16. Java基础_0310:引用传递
  17. Python 基于时间的进程通信
  18. sqlalchemy--表关系
  19. (转)使用 DB2 HADR 选择用于灾难恢复的 SUPERASYNC 模式
  20. [Python WEB开发] 使用WSGI开发类Flask框架 (二)

热门文章

  1. Android4.4 RIL短信接收流程分析
  2. linux学习第一周
  3. 2019年Java面试题基础系列228道(2)
  4. 带你揭秘Shiro(一)
  5. 计算机组成原理——I/O接口以及I/O设备数据传送控制方式
  6. SpringMVC的工作流程?Mybatis和hibernate区别?
  7. 如何修改CAD字体颜色?试试这种方法
  8. Sqoop数据传递
  9. nginx将http升级到https并且同时支持http和https两种请求、http自动转向https
  10. Linux创建Jenkins启动脚本以及开机启动服务