java 数组 反射_【译】10. Java反射——数组

=====================================================================================

用Java反射来处理数组有时候是技巧性很强的。特别是如果你需要获取一个给定类型的数组的Class对象,像int[ ]等。本文将讲述怎么用Java反射来创建数组和获取数组的Class对象。

下面是所涵盖的主题列表:

java.lang.reflect.Array

Creating Arrays

Accessing Arrays

Obtaining the Class Object of an Array

Obtaining the Component Type of an Array

=====================================================================================

java.lang.reflect.Array

通过Java反射来处理数组需要用到java.lang.reflect.Array类。不要和Java集合中的java.util.Arrays类搞混淆了,它包含一些工具方法,像给数组排序、将数组转换成集合等。=====================================================================================

CreatingArrays

通过Java反射来创建数组需要用到java.lang.reflect.Array类。下面的这个例子中会展示如何去创建一个数组:

int[] intArray = (int[]) Array.newInstance(int.class, 3);

这段代码示例创建了一个int型的数组。Array.newInstance()方法的第一个参数int.class指定了数组中的每个元素应该是什么类型。第二个参数声明了该数组应该为多少个元素开辟空间。

=====================================================================================

AccessingArrays

也可以通过Java反射来访问数组中的元素。这是通过Array.get(…)和Array.set(…)方法做到的。下面是一个例子:

int[] intArray = (int[]) Array.newInstance(int.class, 3);

Array.set(intArray,0, 123);

Array.set(intArray,1, 456);

Array.set(intArray,2, 789);

System.out.println("intArray[0] = " + Array.get(intArray, 0));

System.out.println("intArray[1] = " + Array.get(intArray, 1));

System.out.println("intArray[2] = " + Array.get(intArray, 2));

这段代码示例输出如下:

intArray[0] = 123intArray[1] = 456intArray[2] = 789

=====================================================================================

Obtaining the Class Object of an Array

我在Butterfly DI Container项目中开发脚本语言时遇到一个问题,如何通过Java反射获得数组的Class对象。不用反射你可以这样做:

Class stringArrayClass = String[].class;

对数组用Class.forName()不是很直观。例如,你可以像这样访问基本类型数组的Class对象:

Class intArray = Class.forName("[I");

JVM中用字母I代表int。在左边加上[(左中括号)表示我比较感兴趣的int数组的类。这对所有其他的基本类型同样有效。

对于对象,你需要用一个稍微不同的符号:

Class stringArrayClass = Class.forName("[Ljava.lang.String;");

注意类名左边的[L和右边的分号(;)。这表示一个你指定类型的对象的数组。

附注,你不能用Class.forName()获取基本类型的Class对象。下面的例子都会导致ClassNotFoundException:

Class intClass1 = Class.forName("I");

Class intClass2= Class.forName("int");

我通常像这样做来获取基本类型和对象的类型名:

publicClass getClass(String className){if("int" .equals(className)) return int .class;if("long".equals(className)) return long.class;

...returnClass.forName(className);

}

一旦你获取了一种类型的Class对象,你也可以很简单的获取一个数组类型的Class对象。方案,或者你叫它变通措施,是先创建一个你期望的类型的空数组,然后从这个空数组获取它的Class对象。这感觉有作弊的嫌疑,但是很有效。下面是它看起来的样子:

Class theClass =getClass(theClassName);

Class stringArrayClass= Array.newInstance(theClass, 0).getClass();

这代表一个单一的、统一的访问任何类类型的数组。没有摆弄类名等。

为了确认该Class对象的确是一个数组,你可以调用Class.isArray()来检查:

Class stringArrayClass = Array.newInstance(String.class, 0).getClass();

System.out.println("is array: " + stringArrayClass.isArray());

=====================================================================================

Obtaining the Component Type of an Array

一旦你获取了数组的Class对象,你可以通过Class.getComponentType()方法访问它的元素类型。元素类型是数组中元素的类型。例如,int[ ]数组的元素类型是int.class的Class对象。String[ ]数组的元素类型是java.lang.String的Class对象。

下面是一个访问数组元素类型的例子:

String[] strings = new String[3];

Class stringArrayClass=strings.getClass();

Class stringArrayComponentType=stringArrayClass.getComponentType();

System.out.println(stringArrayComponentType);

这个例子将会输出String数组的元素类型"java.lang.String"。

========================================================================================

目录

这是一个本教程到目前为止涵盖的主题列表:

(敬请期待下一篇翻译)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/529535.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

定时执行java程序_如何让Java程序定时运行

由于项目开发的需要,必须实现让一个Java程序定时运行。比如,我的项目中,有一个网络蜘蛛,需要从互联网上抓取数据,与其配合,有另一个程序来对新抓取的页面进行索引的创建,由于数据源更新频率不高…

java递归实现排序_快速排序算法原理及java递归实现

快速排序 对冒泡排序的一种改进,若初始记录序列按关键字有序或基本有序,蜕化为冒泡排序。使用的是递归原理,在所有同数量级O(n longn) 的排序方法中,其平均性能最好。就平均时间而言,是目前被认为最好的一种内部排序方…

java 泛型 .net_Java泛型

标签:上一篇博文java8函数式编程--收集器collector:(http://my.oschina.net/joshuashaw/blog/487322)讲得比较随性,并没有把源码一句一句拿出来分析,后来发现groupingBy方法最后有一个if-else分支用来返回不同类型的collector&…

卡法电子商务 java_javacard DES算法API使用示例

********** 2017年3月15日留言 ——关于java卡Applet系列csdn博文 *************貌似有不少人在看我写的几篇关于java卡applet的博文,也收到了一些评论指正博文错误,或者私信叫我发代码文件过去。在此需要说明的是,java卡applet的这几篇博文…

java http请求原理_浅谈Spring Cloud zuul http请求转发原理

spring cloud 网关,依赖于netflix 下的zuul 组件zuul 的流程是,自定义 了ZuulServletFilter和zuulServlet两种方式,让开发者可以去实现,并调用先来看下ZuulServletFilter的实现片段Overridepublic void doFilter(ServletRequest s…

java堆外内存溢出_JVM 案例 - 堆外内存导致的溢出错误

案例一个网站为了实现客户端实时从服务端接收数据,使用了 CometD 1.1.1 作为服务端推送框架,服务器是 Jetty7.1.4,CPU i5,内存 4G,操作系统 32位Windows。服务端常常抛出内存溢出异常,管理员把堆开到最大(3…

java mail outlook_已启用Outlook API邮件与邮箱用户

一个非常微妙的问题,也许是特定的环境 . 我正在尝试使用Outlook 2010 API从启用邮件的用户中识别邮箱用户 . 我们在Notes to Exchange迁移期间使用Dell Quest迁移工具,它是一个流动的项目 . 仍处于原型阶段,因此使用VB宏来最终将在C&#xff…

oracle java存储过程返回值_java程序调用Oracle 存储过程 获取返回值(无返回,非结果集,结果集)...

java程序调用Oracle 存储过程 获取返回值(无返回,非结果集,结果集)oracle中procedure是不能有返回值的,要想返回值,就得有输出参数,同样要想返回记录集,可以把游标类型作为输出参数。下面是详细情况说明&am…

mysql dump工具升级_MySQL数据库升级

当前不少系统的数据库依旧是MySQL5.6,由于MySQL5.7及MySQL8.0在性能及安全方面有着很大的提升,因此需要升级数据库。本文通过逻辑方式、物理方式原地升级来介绍MySQL5.6 升级至MySQL5.7的方法,并介绍其使用场景。1. 逻辑方式升级逻辑方式升级…

java int 128 ==_为什么 Java Integer 中“128==128”为false,而”100==100“为true?

这是一个挺有意思的讨论话题,让我们用代码说话吧!运行下面的代码:Integer a 128, b 128;System.out.println(a b);Integer c 100, d 100;System.out.println(c d);你会得到:falsetrue基本知识:我们知道,如果两个引用指向同一个对象&…

mysql课程表学时_Mysql 巩固提升 (学生表_课程表_成绩表_教师表)

方便Mysql 巩固提升创建表并插入数据:-- ------------------------------ Table structure for student-- ----------------------------DROP TABLE IF EXISTS student;CREATE TABLE student (id int(11) NOT NULL AUTO_INCREMENT,sname varchar(32) DEFAULT NULL,s…

初始java_第一章__初始JAVA

1.java的三个发展方向:JAVASE(面向对象、API、JVM)、JAVAME(移动设备、游戏、通信)、JAVAEE(JSP、EJB、服务)2.开发JAVA的程序步骤:1.编写源程序 2.编译 3.运行3.JDKJRE开发工具下载java环境jdk 安装并配置环境变量,.安装直接下一步下一步直到…

python最常用的版本、也称为classic_2021年中国大学《创新思维与创业》单元测试答案...

2021年中国大学《创新思维与创业》单元测试答案被人们称为 “寒地水稻第一人”的是袁隆平答:错地图数据的基本特征包括答:时间属性 空间定位属性 地理属性对卖方征税导致商品价格上升答:√( )是在床榻上使用的一种矮形家具。答:炕…

java 泛型 继承_java基础之泛型的继承

关于泛型的基本介绍和理解请参考以下几篇文章&#xff0c;或查询更多资料&#xff1a;本篇以简单的List<>方式来进行说明。ArrayList继承了List,ArrayList没有继承ListList>等价于List extends Object>请参考以下代码&#xff1a;/*** author Ding Chengyun* 2014-…

appium java环境_Appium环境搭建(Windows版)

注&#xff1a;appium安装到C盘&#xff0c;node.js安装到C盘一、安装node.js1、到官网下载node.js&#xff1a;https://nodejs.org/en/download/2、获取到安装文件后&#xff0c;直接双击安装文件&#xff0c;根据程序的提示&#xff0c;完成nodejs的安装。3、安装完成后&…

ci mysql pdo_CI框架中pdo的使用方法

1、配置文件修改application/config文件夹下的database.php文件 $db[default] array(dsn > mysql:dbnameci_ecshop;host127.0.0.1,username > root,password > ,dbdriver > pdo,2、查询操作$sql select * from aaa where id :id;$sql_array array(:id > …

ie11加载java插件_IE浏览器中ActiveX插件的使用

在某些行业的B/S应用系统中会不可避免的要用到ActiveX浏览器插件&#xff0c;而ActiveX插件只能在IE内核浏览器中运行&#xff0c;而常用的IE浏览器的版本众多&#xff0c;从IE6到IE11&#xff0c;总共有6个版本&#xff0c;这就给开发的应用系统造成了不小的困扰&#xff1a;如…

netty java开发文档_Netty简明教学文档

写个简单点&#xff0c;比较小白的文档&#xff0c;言语比较接地气Netty是什么&#xff1f;NIO的高层封装&#xff0c;NIO很难写&#xff0c;所以有了Netty&#xff0c;方便异步的操作service的主要代码片段public void run() throws Exception {EventLoopGroup bossGroup new…

mysql 全局不重复_php uniqid() 通过MYSQL实现全局不重复的唯一ID

看了国外文章&#xff1a;https://jason.pureconcepts.net/2013/09/php-convert-uniqid-to-timestamp/ 不想写&#xff50;&#xff48;&#xff50;脚本uniqid()处理&#xff0c;想到用mysql一次性把数据库的ID改过来的方法&#xff0c;所以开始了以下研究方法一: 效率最高&…

java接口允许ajax访问_服务允许AJAX请求,允许跨域请求

当工作时间&#xff0c;因为需要JS 进行AJAX请求&#xff0c;这时候存在跨域问题&#xff0c;当出现这种情况时&#xff0c;有多种方案解决比如使用JSONP&#xff0c;也有一种简单的方式&#xff0c;就是在过滤器里面增加返回请求允许跨域head配置。代码如下&#xff1a;/**** …