- java.lang.reflect.Array
- Creating Arrays
- Accessing Arrays
- Obtaining the Class Object of an Array
- Obtaining the Component Type of an Array
通过Java反射操作数组有时候有点棘手。尤其是当你获取是准确的数组对象,比如int[]
等。本文将讲述通过Java反射来创建数组以及得到他们的对象。
注意:在阅读了Eyal Lupu - All About Java本文已经更新了。本文引用了它的观点。
java.lang.reflect.Array
通过Java反射来操作数组是通过java.lang.reflect.Array
来完成的。不要和java.util.Array
中的数组搞混淆了。后者包含了一些了的有效的数组排序,转换成集合的方法等。
创建数组
通过Java反射创建数据是通过java.lang.reflect.Array
类完成的。例子中展示了怎样创建数组:
1 | int[] intArray = (int[]) Array.newInstance(int.class, 3); |
例子中创建了一个int类型的数组。Array.newInstance()
方法的第一个参数告诉了我们数组的元素类型。第二参数告诉了数组的长度。
访问数组
使用Java反射是能够访问数组中的每个元素的。这是通过Array.get(...)
和Array.set(...)
方法完成的。例子如下:
1 | int[] intArray = (int[]) Array.newInstance(int.class, 3); |
代码将输出:
1 | intArray[0] = 123 |
获取数组的类对象
在我使用脚步语言Butterfly DI Container的时候,总会有个问题怎样通过Java反射区去获取数组对象的类对象。如果不适用反射的话,你可以这样获取:
1 | Class stringArrayClass = String[].class; |
使用Class.forName()这样做不是很简单。比如你可以想下面这样获取基本数据类型的int型数组。
1 | Class intArray = Class.forName("[I"); |
JVM通过字母I
表示int。在I
左边的[
字符表示我申明的是int型数组的的类。其他基本的数据类型都可以这样做。
对于其他的对象型数据类型获取方式略有(slightly)不同。
1 | Class stringArrayClass = Class.forName("[Ljava.lang.String;"); |
注意类型左边的到[L
和右边的;
符号。这意味着返回一个指定类型的数组。
作为反例,能不能通过Class.forName()
来获取基本的数据类型数组。下面的列子将会报ClassNotFoundException
:
1 | Class intClass1 = Class.forName("I"); |
我通常像下面的方式来获取基本的数据类型和对象型数据的类名:
1 | public Class getClass(String className){ |
一旦你获取到了类的类型,这里有一张简单方式来获取类的数组。你也需叫做解决方式,是先创建一个空的指定类型的数组,然后从这个空的数组中获取指定的类对象。这看起来是个骗人的,但是确实有效的。代码如下:
1 | Class theClass = getClass(theClassName); |
这提供了一个单一的,统一的方法来访问任何类型的数组的数组类。没有使用到类名等等。
为了确认类对象确确是一个数组,你可以使用Class.isArray()
方法来检查。
1 | Class stringArrayClass = Array.newInstance(String.class, 0).getClass(); |
获取数组的主键类型
一旦你获取到了数组的类对象,你可以使用Class.getComponentType()
获取到他的主键类型。主键类型就是数组元素的类型。比如说int[] 数组的主键类型就是int类型的对象。String[] 数组的主键类型就是String类型的类对象。
例子如下:
1 | String[] strings = new String[3]; |
代码将输出java.lang.String
,并且这个主键类型是String数组的。