原文地址 作者: Jakob Jenkov 译者:叶文海(yewenhai@gmail.com)
内容索引
java.lang.reflect.Array
创建一个数组
访问一个数组
获取数组的Class对象
获取数组的成员类型

利用反射机制来处理数组会有点棘手。尤其是当你想要获得一个数组的Class对象,比如int[]等等。本节会讨论通过反射机制创建数组和如何获取数组的Class对象。

注意:在阅读Eyal Lupu的博客文章“Two Side Notes About Arrays and Reflection”之后对本文的内容做了更新。目前这个版本参考了这篇博文里面的内容。

java.lang.reflect.Array

Java反射机制通过java.lang.reflect.Array这个类来处理数组。不要把这个类与Java集合套件(Collections suite)中的java.util.Arrays混淆,java.util.Arrays是一个提供了遍历数组,将数组转化为集合等工具方法的类。

创建一个数组

Java反射机制通过java.lang.reflect.Array类来创建数组。下面是一个如何创建数组的例子:

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

这个例子创建一个int类型的数组。Array.newInstance()方法的第一个参数表示了我们要创建一个什么类型的数组。第二个参数表示了这个数组的空间是多大。

访问一个数组

通过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] = 123
intArray[1] = 456
intArray[2] = 789

获取数组的Class对象

在我编写Butterfly DI Container的脚本语言时,当我想通过反射获取数组的Class对象时遇到了一点麻烦。如果不通过反射的话你可以这样来获取数组的Class对象:

Class stringArrayClass = String[].class;

如果使用Class.forName()方法来获取Class对象则不是那么简单。比如你可以像这样来获得一个原生数据类型(primitive)int数组的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");

我通常会用下面这个方法来获取普通对象以及原生对象的Class对象:

public Class getClass(String className){if("int" .equals(className)) return int .class;if("long".equals(className)) return long.class;...return Class.forName(className);
}

一旦你获取了类型的Class对象,你就有办法轻松的获取到它的数组的Class对象,你可以通过指定的类型创建一个空的数组,然后通过这个空的数组来获取数组的Class对象。这样做有点讨巧,不过很有效。如下例:

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

这是一个特别的方式来获取指定类型的指定数组的Class对象。无需使用类名或其他方式来获取这个Class对象。
为了确保Class对象是不是代表一个数组,你可以使用Class.isArray()方法来进行校验:

Class stringArrayClass = Array.newInstance(String.class, 0).getClass();
System.out.println("is array: " + stringArrayClass.isArray());

获取数组的成员类型

一旦你获取了一个数组的Class对象,你就可以通过Class.getComponentType()方法获取这个数组的成员类型。成员类型就是数组存储的数据类型。例如,数组int[]的成员类型就是一个Class对象int.class。String[]的成员类型就是java.lang.String类的Class对象。
下面是一个访问数组成员类型的例子:

String[] strings = new String[3];
Class stringArrayClass = strings.getClass();
Class stringArrayComponentType = stringArrayClass.getComponentType();
System.out.println(stringArrayComponentType);

下面这个例子会打印“java.lang.String”代表这个数组的成员类型是字符串。

Java Reflection(十):数组相关推荐

  1. java基础(十) 数组类型

    ###1. 数组类简介 在java中,数组也是一种引用类型,即是一种类. 我们来看一个例子,理解一下数组类: public static void main(String[] args) {Class ...

  2. java基础(十) 深入理解数组类型

    戳上面的蓝字关注我们哦! 精彩内容 精选java等全套视频教程 精选java电子图书 大数据视频教程精选 java项目练习精选 1. 数组类简介   在java中,数组也是一种引用类型,即是一种类. ...

  3. java培训:Java的十大算法

    想要学好java语言,就要打好基础,java要学习的东西有很多,今天小编就来和大家说下java的十大算法. 算法一:快速排序算法 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个 ...

  4. java reflection list_Java Reflection(九):泛型

    我常常在一些文章以及论坛中读到说Java泛型信息在编译期被擦除(erased)所以你无法在运行期获得有关泛型的信息.其实这种说法并不完全正确的,在一些情况下是可以在运行期获取到泛型的信息.这些情况其实 ...

  5. Java Reflection(九):泛型

    原文地址 作者: Jakob Jenkov 译者:叶文海(yewenhai@gmail.com) 内容索引 运用泛型反射的经验法则 泛型方法返回类型 泛型方法参数类型 泛型变量类型 我常常在一些文章以 ...

  6. java构造函数内部调用_具有内部类构造函数参数的Java Reflection奇数

    java构造函数内部调用 关于Java内部类 Java允许成员类(在其他类内定义的类),局部类(在语句块内定义的类)和匿名类(无名称的类): class Outer {Object anonymous ...

  7. 具有内部类构造函数参数的Java Reflection奇数

    关于Java内部类 Java允许成员类(在其他类内定义的类),局部类(在语句块内定义的类)和匿名类(无名称的类): class Outer {Object anonymous = new Object ...

  8. JAVA Reflection(反射机制)续

    接上一篇文章  JAVA Reflection(反射机制) 动态数组 java.lang.reflect.Array static Object set(Object array, int index ...

  9. java二维数组添加数据_我敢保证,全网没有再比这更详细的Java知识点总结了,送你啊...

    接下来你看到的将是全网最详细的Java知识点总结,全文分为三大部分:Java基础.Java框架.Java+云数据 小编将为大家仔细讲解每大部分里面的详细知识点,别眨眼,从小白到大佬.零基础到精通,你 ...

最新文章

  1. ssh登陆分布式服务器进行编程
  2. 用命令创建表空间、用户,并为用户授权、收回权限。
  3. 无法在PC上找到,android app 创建的文件 问题.
  4. 【干货】--手把手教你完成文本情感分类
  5. COSCon'19 开源治理论坛——技术之外,那些更重要的事
  6. Gateway配合sentinel自定义限流_Spring Cloud Gateway网关如何快速实施限流方案?-Part 6...
  7. 188.买卖股票的最佳时机IV
  8. 时间序列平稳性检验方法汇总
  9. SDI Over IP相关标准及技术简介
  10. 微信服务器保留几年记录_MongoDB日志记录
  11. [TYVJ]选课lzl初一
  12. 联想G40-30进入PE鼠标键盘失灵解决方法
  13. 竞争对手强势、内忧仍存,小米如何守住智能家居高地?
  14. 数字MIC(es7202 PDM协议)MIC录音声音较小
  15. 分析:日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯 的一个。以下为4个嫌疑犯的供词, 问题
  16. sequence_loss_by_example()函数在Tensorflow2.x找不到
  17. volley与java版本_如何使用Volley在Android中实现登录?
  18. JSON是什么,有什么用,怎么写json
  19. 【19考研】复试英语 自我介绍模板
  20. [Excel]Excel函数和用法(4)——查找字符串,SEARCH和FIND函数

热门文章

  1. linux进程状态d状态,Linux下进程的状态
  2. python画七边形的角度_python之turtle模块-生化危机
  3. Java项目:宠物医院预约挂号系统(java+JSP+Spring+SpringBoot+MyBatis+html+layui+maven+Mysql)
  4. 两个苹果手机怎么传通讯录_苹果手机通讯录丢失怎么恢复?货真价实的通讯录恢复技巧...
  5. 搜索进程内存地址_Linux编程 6 (查看进程 ps 及输出风格)
  6. jMonkey Engine SDK3 中文乱码问题
  7. python uwsgi_python Web开发你要理解的WSGI uwsgi详解
  8. iOS12-crash错误-reason: 'UITableView failed to obtain a cell from its dataSource'
  9. C/C++利用三元组实现稀疏矩阵运算
  10. Alpha 冲刺 (2/10)