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架飞机运 ...
随机推荐
- SAP QA32试图做UD,系统报错-工厂 BTYC中的 QM 基选设置需要维护
SAP QA32 试图做UD,系统报错 - 工厂 BTYC 中的 QM 基选设置需要维护 - 检验批 10000062593,试图做使用决策,系统报错, 工厂 BTYC 中的 QM 基选设置需要维护 ...
- 《Hands-On System Programming with Go》之目录操作
开一个新书<Hands-On System Programming with Go>,系统的了解一下, 这方面的东东,以前用C语言实现过, 现在用GO,重新来!! package main ...
- Python中的测试工具
当我们在写程序的时候,我们需要通过测试来验证程序是否出错或者存在问题,但是,编写大量的测试来确保程序的每个细节都没问题会显得很繁琐.在Python中,我们可以借助一些标准模块来帮助我们自动完成测试 ...
- 分布式全局唯一ID生成策略
一.背景 分布式系统中我们会对一些数据量大的业务进行分拆,如:用户表,订单表.因为数据量巨大一张表无法承接,就会对其进行分库分表. 但一旦涉及到分库分表,就会引申出分布式系统中唯一主键ID的生成问题. ...
- varnish实现缓存加速
varnish实现缓存加速 一.采用varnish为nginx实现缓存加速1.实验环境:(1)一台varnish缓存服务器,一台nginx服务器(2)关闭防火墙和selinux2.配置varnish( ...
- 每天学点HTML01
HTML背景 HTML 又叫超文本标记语言 ,诞生于20世纪90年代初 <html> <head><title>demo1</title> </h ...
- 【2期】JVM必知必会
JVM之内存结构图文详解 Java8 JVM内存结构变了,永久代到元空间 Java GC垃圾回收机制 不要再问我“Java 垃圾收集器”了 Java虚拟机类加载机制 Java虚拟机类加载器及双亲委派机 ...
- 一天两道pat(3)1007,1008
1007没什么好说的,就是注意暴力求素数的时候,循环到(根号n)+1就好: 重点说说1008,不用新开一个数组就实现循环移位的操作 一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下 ...
- Fiddler使用方法之Fiddler显示IP,Fiddler中文乱码解决方法以及Fiddler模拟发送get/post请求
Fiddler是一个HTTP的调试代理,以代理服务器的方式,监听系统的Http网络数据流动,是我们常用的抓包工具之一 今天为大家分享一下几个使用Fiddler的小技巧 一.Fiddler抓包中文乱码问 ...
- docker jenkins安装
https://hub.docker.com/r/jenkins/jenkins jenkins的docker官方镜像地址 https://jenkins.io/ jenkins官方网站 环境: 阿里 ...