Better

业精于勤荒于嬉

Java反射10-数组

Better's Avatar 2017-02-26 Java译文

  1. 1. java.lang.reflect.Array
  2. 2. 创建数组
  3. 3. 访问数组
  4. 4. 获取数组的类对象
  5. 5. 获取数组的主键类型
  • 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
2
3
4
5
6
7
8
9
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));

代码将输出:

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

获取数组的类对象

在我使用脚步语言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
2
Class intClass1 = Class.forName("I");
Class intClass2 = Class.forName("int");

我通常像下面的方式来获取基本的数据类型和对象型数据的类名:

1
2
3
4
5
6
public Class getClass(String className){
if("int" .equals(className)) return int .class;
if("long".equals(className)) return long.class;
...
return Class.forName(className);
}

一旦你获取到了类的类型,这里有一张简单方式来获取类的数组。你也需叫做解决方式,是先创建一个空的指定类型的数组,然后从这个空的数组中获取指定的类对象。这看起来是个骗人的,但是确实有效的。代码如下:

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

这提供了一个单一的,统一的方法来访问任何类型的数组的数组类。没有使用到类名等等。
为了确认类对象确确是一个数组,你可以使用Class.isArray()方法来检查。

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

获取数组的主键类型

一旦你获取到了数组的类对象,你可以使用Class.getComponentType()获取到他的主键类型。主键类型就是数组元素的类型。比如说int[] 数组的主键类型就是int类型的对象。String[] 数组的主键类型就是String类型的类对象。
例子如下:

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

代码将输出java.lang.String,并且这个主键类型是String数组的。

原文

This article was last updated on days ago, and the information described in the article may have changed.