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. 3.Android-ADT之helloworld项目结构介绍

    1.helloworld项目结构如下图所示: src 放项目的源代码的.而MainActivity.java文件则对应helloworld界面代码,代码如下所示: gen BuildConfig.ja ...

  2. JS + Canvas画图Demo

    直接上代码,复制粘贴就能用: <%@ page language="java" contentType="text/html; charset=UTF-8" ...

  3. Android 警告对话框 AlertDialog

    @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); s ...

  4. deinit 没执行

    写了一个自定义的UIView,其中包含代理       然后设置UIViewController为此UIView的代理       结果UIViewController里的deinit没执行,导致内存 ...

  5. Linux Redis 安装(带视频)

    疯狂创客圈 Java 高并发[ 亿级流量聊天室实战]实战系列 [博客园总入口 ] 架构师成长+面试必备之 高并发基础书籍 [Netty Zookeeper Redis 高并发实战 ] 疯狂创客圈 高并 ...

  6. SpingSecurity + SpringSession 死磕

    SpingSecurity + SpringSession 整合 疯狂创客圈 Java 高并发[ 亿级流量聊天室实战]实战系列 [博客园总入口 ] 架构师成长+面试必备之 高并发基础书籍 [Netty ...

  7. dubbo 获取不到本地地址,返回 127.0.0.1

    2019-08-14 12:29:09.609  WARN 1079 --- [           main] org.apache.dubbo.config.AbstractConfig   :  ...

  8. Mysql字符串截取_获取指定字符串中的数据

    前言:本人遇到一个需求,需要在MySql的字段中截取一段字符串中的特定字符,类似于正则表达式的截取,苦于没有合适的方法,百度之后终于找到一个合适的方法:substring_index('www.sql ...

  9. python基础(36):pymysql模块

    1. pymysql模块 在使用pymysql模块前需要学习数据库MySQL:<MySQL基础>. 1.1 pymysql的下载和使用 看完MySQL基础,我们都是通过MySQL自带的命令 ...

  10. spring4 学习4 spring MVC+mybatis+Mysql

    在前面搭建的基础上,引入新的jar包如下: aopalliance-1.0.jaraspectjweaver-1.8.8.jarmybatis-3.3.0.jarmybatis-spring-1.2. ...