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

用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"。

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

目录

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

(敬请期待下一篇翻译)

java 数组 反射_【译】10. Java反射——数组相关推荐

  1. alxctools索引超出了数组界限_[译]V8中的数组类型

    译者:蒋海涛 JavaScript 对象可以和任何属性有关联.对象属性的名称可以包含任何字符.有趣的是 JavaScript 引擎可以选择名称为纯数字的属性来进行优化,而这个属性其实就是数组 inde ...

  2. java正则表达式性能_译:Java 中的正则表达式性能概述

    译者:Darren Luo 1. 概述 在本快速教程中,我们将展示模式匹配引擎是如何工作的.我们还将介绍在 Java 中优化正则表达式的不同方式. 有关正则表达式的的使用介绍,请参阅此文. 2. 模式 ...

  3. 如何理解java反射_怎么理解java反射

    怎么理解java反射? 概述 Java 反射是可以让我们在运行时获取类的方法.属性.父类.接口等类的内部信息的机制.也就是说,反射本质上是一个"反着来"的过程.我们通过new创建一 ...

  4. java 防止反射_如何防止JAVA反射对单例类的攻击?

    在我的上篇随笔中,我们知道了创建单例类有以下几种方式: (1).饿汉式; (2).懒汉式(.加同步锁的懒汉式.加双重校验锁的懒汉式.防止指令重排优化的懒汉式); (3).登记式单例模式; (4).静态 ...

  5. esp8266接收到的数据如何存放到数组中_愉快地学Java语言:第七章 数组

    导读 本文适合Java入门,不太适合Java中高级软件工程师.本文以<Java程序设计基础篇>第10版为蓝本,采用不断提出问题,然后解答问题的方式来讲述.本篇文章只是这个系列中的一篇,如果 ...

  6. java 字节 操作_实例解析Java byte数组操纵方式代码

    字节数组的关键在于它为存储在该部分内存中的每个8位值提供索引(快速),精确的原始访问,并且您可以对这些字节进行操作以控制每个位. 坏处是计算机只将每个条目视为一个独立的8位数 - 这可能是你的程序正在 ...

  7. JAVA不同类型数组重载_方法的重载;数组 (Java Day05)

    一,方法的重载 概念:在一个类中,拥有多个方法名相同,参数列表不同的方法的现象叫做方法的重载 特征: ​            1.在同一个类中 ​            2.方法名相同 ​     ...

  8. 重庆找Java开发工作_重庆【Java开发程序员】

    重庆[Java开发程序员],提倡一切为了学员就业的办学思想,教学过程中坚持以练习企业项目为主,让学员真正能学到技术,毕业就能适应工作岗位. 重庆[Java开发程序员], Java 编程开发.而且很多软 ...

  9. java 异常机制_深入理解Java异常处理机制

    一.引子 try-catch-finally恐怕是大家再熟悉不过的语句了,而且感觉用起来也是很简单,逻辑上似乎也是很容易理解.不过,我亲自体验的"教训"告诉我,这个东西可不是想象中 ...

  10. java string 序列化_详解JAVA序列化

    享学课堂作者:逐梦々少年 转载请声明出处! 现在开发过程中经常遇到多个进程多个服务间需要交互,或者不同语言的服务之间需要交互,这个时候,我们一般选择使用固定的协议,将数据传输过去,但是在很多语言,比如 ...

最新文章

  1. hdu 2777(线段树)
  2. Yarn管理界面中Queue:root和Queue:default的区别
  3. Pocketflow 使用
  4. react 树形菜单_react使用antd组件递归实现左侧菜单导航树
  5. Linux之find exec
  6. IPython notebook(Jupyter Notebook) 的使用
  7. python 判断是否有某个属性_用Python怎么判断是否闰年?
  8. 移动硬盘插入提示需要格式化RAW_Macbook无法识别移动硬盘?!不仅仅因为硬盘格式问题...
  9. 安装SQL 2000挂起的解决办法
  10. 《死神》现队长、原队长和假面的对照
  11. bzoj 4484 [Jsoi2015]最小表示
  12. 初识ArrayList集合【小白学Java-学习笔记02】
  13. ESP8266红外学习遥控器
  14. 关于Monkey稳定性测试,这是我看到最详细的文章
  15. 学计算机前端技术学院,百度前端技术学院(任务)
  16. fatal: No url found for submodule path ‘xxx/xxx‘ in .gitmodules gitsubmodule子仓库无法拉取问题
  17. 他俩很般配应该这么说
  18. Adobe Flash Player 版本太低无法安装
  19. CRM系统在销售中的应用
  20. 关于小程序开发的一些资源

热门文章

  1. 边缘计算精华问答 | 5G是否会“逼退”4G?
  2. 这是一则计算机视觉顶级会议CVPR与腾讯的爆闻,啥?
  3. 用数据库修改服务器的时间格式,如何查询数据库服务器的时间格式
  4. vue 报错error: ‘to‘ is defined but never used (no-unused-vars)
  5. springboot 整合mybatisplus输出sql语句不输出结果集
  6. VBA各种查询方法介绍和应用举例
  7. VBA SQL查询-记录集转数组
  8. python三菱_三菱机器人melfarxm.ocx控件的Python使用,MelfaRxMOCX,python,用法
  9. python3 网站状态监控_基于python3监控服务器状态进行邮件报警
  10. java 发送邮件_Jenkins实现自动化邮件发送踩坑记录