Java 数组

作者: 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 反射 数组,Java 数组相关推荐

  1. java 反射 镜子,java反射机制 - 巍巍的个人页面 - OSCHINA - 中文开源技术交流社区...

    java反射机制 一. 1.了解反射的作用 2.掌握Class类的操作及使用 3.可以通过反射取得一个类的实例化对象 4.可以通过反射取得类的结构,可以通过反射进行属性方法的调用 二.认识反射 Jav ...

  2. Java反射之java.lang.reflect.Method

    前一篇文章讲了Class中的成员变量(java.lang.reflect.Field)的常用使用方式以及其注意事项.我们接着讲Class中的方法(java.lang.reflect.Method). ...

  3. Java反射,参数为数组

    使用反射调用非公开的方法有时能解决许多问题,如果方法的参数是数组时类型该怎么传递呢?这里找到了一种方法记录一下 实例 比如: class A{private void sayHello(String[ ...

  4. java反射机制之数组转对象

    一.反射对象帮助类 /***@Description TODO 将数组转换成对象 注意参数要一一致*@Author QuZhangJing*@Date 17:54 2018/8/30*@Version ...

  5. java反射泛型类型,【Java反射】Java 泛型基础

    Java Reflect 综述 方法的反射 成员变量的反射 构造函数的反射 类加载机制 在面向对象的世界里,万事万物皆对象. 但在Java里面有两样东西不是对象:静态的成员.普通数据类型类(但它们有封 ...

  6. java反射 setAccess,Java反射 - setAccessible的影响(真)Java反射 - setAccessib

    我使用了一些注释动态设置在类字段的值. 因为我想做到这一点,无论它是公共的,保护的,还是私人的,我是一个呼叫setAccessible(true)每次Field对象上调用之前set()方法. 我的问题 ...

  7. Android IOC模块,利用了Java反射和Java注解

    一.整体工程图 二.BaseActivity.java [java] view plaincopy package com.jltxgcy.framework; import android.os.B ...

  8. java 反射 getter,java – 通过反射调用getter的最佳方式

    我认为这应该指向正确的方向: import java.beans.* for (PropertyDescriptor pd : Introspector.getBeanInfo(Foo.class). ...

  9. java 反射 asm,Java反射工具包reflectasm

    1. com.esotericsoftware reflectasm 1.11.9 1.实体类 package com.redisson; /** * @Description TODO * @Dat ...

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

    ===================================================================================== 用Java反射来处理数组有时 ...

最新文章

  1. 【深度学习】基于Pytorch多层感知机的高级API实现和注意力机制(一)
  2. 《C++ primer》--第10章
  3. http的“无连接”指的是_http协议无状态中的 quot;状态quot; 到底指的是什么?...
  4. MySQL 普通索引和唯一索引的区别详解
  5. “编程能力差,90%输在了这点上!”谷歌AI专家:其实你们都是瞎努力
  6. c# 汉语拼音排序函数
  7. 【javaIO流】--->IO流解析
  8. 求大神帮助,感激不尽
  9. 【JavaScript】DOM 操作元素样式和元素类名
  10. PyTorch深度学习基础之Reduction归约和自动微分操作讲解及实战(附源码 超详细必看)
  11. 合成资产赛道风云突变,Linear Finance有望成为最具潜力的黑马
  12. 3.4 随机变量的相互独立性
  13. 补色的视觉原理(转)
  14. 外贸人应该灵活运用的“套路”
  15. 改变世界的windows操作系统
  16. TB5128 + Arduino UNO,更方便控制步进电机
  17. Tensorflow学习笔记——tf.set_random_seed函数
  18. 移植GRBL控制器到ESP32实现写字机器人
  19. status code = 404, status message = [Not Found]
  20. 小魔术师――让小孩也来编程

热门文章

  1. PHP ob_get_level嵌套输出缓冲
  2. NetCore 2.0 + Swagger 的WebAPI 模板例子
  3. Hibernate框架 主配置文件 Hibernate.cfg.xml 映射配置 说明
  4. 一个随机数发生器(一)
  5. js获取DIV的位置坐标的三种方法!
  6. SAC 智能版面分析技术(structure Analysis Core )
  7. AndroidStudio安卓原生开发_Activity的基本配置_配置AndroidManifest配置activity的基本信息---Android原生开发工作笔记81
  8. K8S_Google工作笔记0010---通过二进制方式_生成SSL证书文件
  9. IOS学习笔记04---编写第一个C语言程序-Hello World
  10. the value of esp was not properly saved across a function call异常