Java反射04 : 通过Array动态创建和访问Java数组
java.lang.reflect.Array类提供了通过静态方法来动态创建和访问Java数组的操作。
本文转载自:https://blog.csdn.net/hanchao5272/article/details/79416263
1.主要的静态方法
java.lang.reflect.Array提供以下几类静态方法操作:
- Array.newInstance() :创建引用类型的数组
- Array.set()和Array.get() :根据索引,设置和获取指定数组(所有类型的数组)元素的值。
- Array.setXxxx()和Array.getXxxx() :根据索引,设置和获取指定数组(基本数据类型的数组)元素的值。
- 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数组的更多相关文章
- Java 反射 Array动态创建数组
Java 反射 Array动态创建数组 @author ixenos 注:java.lang.reflect.Array 是个反射工具包,全是静态方法,创建数组以多维数组为基准,一维数组只是特殊实现 ...
- java反射机制应用之动态代理
1.静态代理类和动态代理类区别 静态代理:要求被代理类和代理类同时实现相应的一套接口:通过代理类的对象调用重写接口的方法时,实际上执行的是被代理类的同样的 方法的调用. 动态代理:在程序运行时,根据被 ...
- 动态创建二维vector数组 C和C++ 及指针与引用的区别
二维vectorvector<vector <int> > ivec(m ,vector<int>(n)); //m*n的二维vector 动态创建m*n的二 ...
- c++ 模拟java的反射,根据类名动态创建类
参考: https://blog.csdn.net/jnu_simba/article/details/9318799 原先有静态变量依赖问题, https://blog.csdn.net/anony ...
- java反射拼接方法名动态执行方法
近期由于负责项目的一个模块,该模块下有很多分类,每个分类都有一个编码code,这个值是作为一个参数携带过来的.但是每个code确实对应一个方法的. code的值有很多个,自己又不想做ifelse或者s ...
- c# 利用反射 从json字符串 动态创建类的实例 并动态为实例成员赋值
转自 http://hi.baidu.com/wjinbd/item/c54d43d998beb33be3108fdd 1 创建自己要用的类 class stu { string _name; int ...
- java 反射之静态and动态代理
首先说一下我们什么情况下使用代理? (1)设计模式中有一个设计原则是开闭原则,是说对修改关闭对扩展开放,我们在工作中有时会接手很多前人的代码,里面代码逻辑让人摸不着头脑(sometimes the c ...
- java并发编程(二)----创建并运行java线程
实现线程的两种方式 上一节我们了解了关于线程的一些基本知识,下面我们正式进入多线程的实现环节.实现线程常用的有两种方式,一种是继承Thread类,一种是实现Runnable接口.当然还有第三种方式,那 ...
- java之线程(线程的创建方式、java中的Thread类、线程的同步、线程的生命周期、线程之间的通信)
CPU:10核 主频100MHz 1核 主频 3GHz 那么哪一个CPU比较好呢? CPU核不是越多越好吗?并不一定.主频用于衡量GPU处理速度的快慢,举个例子10头牛运送货物快还是1架飞机运 ...
随机推荐
- Gradle 自定义插件
使用版本 5.6.2 插件被用来封装构建逻辑和一些通用配置.将可重复使用的构建逻辑和默认约定封装到插件里,以便于其他项目使用. 你可以使用你喜欢的语言开发插件,但是最终是要编译成字节码在 JVM 运行 ...
- Linux中防火墙命令
#启动 systemctl start firewalld #开机启动 systemctl enable firewalld #停止 systemctl stop firewalld #禁 ...
- 2018 经典的CVPR 关于ImageCaptioning论文
1. SemStyle: Learning to Generate Stylised Image Captions using Unaligned Text(2018 CVPR) 主要研 ...
- 关于css布局的记录(一) --table和flex布局
1.table方式布局 效果图: 直接用table等标签布局,table布局自动垂直居中 亦可用 display:table == <table>.display:table-cell = ...
- 汇编 易混淆指令lea offset
lea 是机器指令,offset 是伪指令. LEA BX, BUFFER ;在实际执行时才会将变量buffer的地址放入bx MOV BX, OFFSET BUFFER ;在编译时就已经计算出buf ...
- 痞子衡嵌入式:飞思卡尔i.MX RTyyyy系列MCU启动那些事(1)- Boot简介
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RTyyyy系列MCU的BootROM功能简介. 截止目前为止i.MX RTyyyy系列已公布的芯片有三款i.MXRT ...
- Python高级特性——迭代器
可以直接用for循环的数据类型有: 集合数据类型,如:list.tuple.dict.set.str等: 生成器generator,包括生成器和带yield的generator function. 以 ...
- ASP.Net 设置 404错误跳转到指定页面
分享 ASP.Net 网站设置 404错误跳转到指定页面的三种方法 方法一:Web.config 配置 1 首先双击打开项目中的“Web.config”文件 找到 system.web 节点,在 c ...
- Redis缓存NoSQL
下面是一些关于Redis比较好的文章,因为篇幅较大,我就将其折叠起来了.不太喜欢分不同的笔记去记载,除非真的很多很多.所以本文不仅要对Redis做简单的介绍,还要分别介绍Redis中的五种结构,并会贴 ...
- delphi使用Chilkat 组件和库从SFTP下载文件
官网地址:https://www.example-code.com/delphiDll/default.asp 实例代码:(不包括全局解锁) 密码生成器:https://www.cnblogs.co ...