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)

Java反射04 : 通过Array动态创建和访问Java数组的更多相关文章

  1. Java 反射 Array动态创建数组

    Java 反射 Array动态创建数组 @author ixenos 注:java.lang.reflect.Array 是个反射工具包,全是静态方法,创建数组以多维数组为基准,一维数组只是特殊实现 ...

  2. java反射机制应用之动态代理

    1.静态代理类和动态代理类区别 静态代理:要求被代理类和代理类同时实现相应的一套接口:通过代理类的对象调用重写接口的方法时,实际上执行的是被代理类的同样的 方法的调用. 动态代理:在程序运行时,根据被 ...

  3. 动态创建二维vector数组 C和C++ 及指针与引用的区别

    二维vectorvector<vector <int> > ivec(m ,vector<int>(n));    //m*n的二维vector 动态创建m*n的二 ...

  4. c++ 模拟java的反射,根据类名动态创建类

    参考: https://blog.csdn.net/jnu_simba/article/details/9318799 原先有静态变量依赖问题, https://blog.csdn.net/anony ...

  5. java反射拼接方法名动态执行方法

    近期由于负责项目的一个模块,该模块下有很多分类,每个分类都有一个编码code,这个值是作为一个参数携带过来的.但是每个code确实对应一个方法的. code的值有很多个,自己又不想做ifelse或者s ...

  6. c# 利用反射 从json字符串 动态创建类的实例 并动态为实例成员赋值

    转自 http://hi.baidu.com/wjinbd/item/c54d43d998beb33be3108fdd 1 创建自己要用的类 class stu { string _name; int ...

  7. java 反射之静态and动态代理

    首先说一下我们什么情况下使用代理? (1)设计模式中有一个设计原则是开闭原则,是说对修改关闭对扩展开放,我们在工作中有时会接手很多前人的代码,里面代码逻辑让人摸不着头脑(sometimes the c ...

  8. java并发编程(二)----创建并运行java线程

    实现线程的两种方式 上一节我们了解了关于线程的一些基本知识,下面我们正式进入多线程的实现环节.实现线程常用的有两种方式,一种是继承Thread类,一种是实现Runnable接口.当然还有第三种方式,那 ...

  9. java之线程(线程的创建方式、java中的Thread类、线程的同步、线程的生命周期、线程之间的通信)

    CPU:10核 主频100MHz 1核  主频    3GHz 那么哪一个CPU比较好呢? CPU核不是越多越好吗?并不一定.主频用于衡量GPU处理速度的快慢,举个例子10头牛运送货物快还是1架飞机运 ...

随机推荐

  1. GIT实用操作指令(更新中)

    提取多次提交的文件 git archive --format=zip HEAD `git diff --name-only 较早的提交ID 较晚的提交ID` > diff.zip

  2. EVERSPIN非易失性存储器具吸引力嵌入式技术

    相关研究指出,如果以嵌入式MRAM取代微控制器中的eFlash和SRAM,可节省高达90%的功耗:如果采用单一晶体管MRAM取代六个晶体管SRAM,则可实现更高的位元密度和更小的芯片尺寸,这些功率与面 ...

  3. 如何在windows下安装linux双系统

    首先是看这篇博客,讲得很详细,但是有一点小小的区别,这里把整个过程回顾一下. https://www.cnblogs.com/masbay/p/10745170.html 第一步,刻盘,将一个u盘刻录 ...

  4. Leetcode327: Count of Range Sum 范围和个数问题

    ###问题描述 给定一个整数数组,返回range sum 落在给定区间[lower, upper] (包含lower和upper)的个数.range sum S(i, j) 表示数组中第i 个元素到j ...

  5. laravel .env文件的使用

    umen 是 laravel 的衍生品,核心功能的使用和 laravel 都是一致的,但配置文件这一方面,lumen 在 laravel 的基础上增加了更简便的配置方式:lumen 采用了 DotEn ...

  6. python批量插入数据到es和读取es数据

    一.插入数据 1.首先准备类似如下数据 {"_type": "type1", "_id": 1, "_index": & ...

  7. JavaWeb入门——Tomcat的目录结构

    JavaWeb入门——Tomcat的目录结构 摘要:本文主要了解了Tomcat的目录结构. 目录结构 打开Tomcat的目录,可以看到如下文件和文件夹: bin目录 该目录下存放的是二进制可执行文件. ...

  8. How to: Display a List of Non-Persistent Objects in a Popup Dialog 如何:在弹出对话框中显示非持久化对象列表

    This example demonstrates how to populate and display a list of objects that are not bound to the da ...

  9. CSS之border绘制三角形

    用CSS的border可以画出高质量的三角形. 我们一般会这么使用border: #test-border { width: 100px; height: 100px; margin: 100px a ...

  10. Redis Python(二)

    Infi-chu: http://www.cnblogs.com/Infi-chu/ 一.NoSQL(Not only SQL)1.泛指非关系数据库2.不支持SQL语法3.存储结构与传统的关系型数据库 ...