经过反射使用数组有时会比较棘手。特别是须要得到一个特定类型数组的Class对象,如int[]
等。本文将讨论如何经过反射建立数组和得到他们的Class对象。
注意:本文在阅读Eyal Lupu的博客"Two Side Notes About Arrays and Reflection" 后已更新,他的博客是本文第一个版本的评论。当前版本考虑了他的评论内容。java
数组反射是经过类java.lang.reflect.Array
实现的。不要把这个类与集合包的java.util.Arrays
混淆,java.util.Arrays
包含数组排序、转换成集合等。数组
经过反射建立数组是 java.lang.reflect.Array
实现的。示例代码以下:ide
int[] intArray = (int[]) Array.newInstance(int.class, 3);
示例代码建立了一个int
数组。Array.newInstance()
方法的第一个参数int.class
定义了数组每个元素的类型。第二个参数定义数组的元素个数。code
能够经过反射访问数组元素。这是经过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
在实现Butterfly DI Container的脚本语言时一个问题就是如何经过反射得到数组的Class
对象。无反射代码以下:get
Class stringArrayClass = String[].class;
作这些使用Class.forName()
并非直接了当。例如,访问原始int
数组类对象代码:博客
Class intArray = Class.forName("[I");
JVM使用小写l
表明int
。左边的[
的意思是它是我有兴趣的int
数组的类对象。其余基本类型也是按照这个模式工做。
对于其余类型对象,须要使用稍微不一样的符号:string
Class stringArrayClass = Class.forName("[Ljava.lang.String;");
注意:[L
在类名的左侧,;
在类名的右侧。这段代码的意思是给定类型的数组对象。
做为旁注,你不能使用Class.forName()
得到基本类型的类对象。下面的两行代码都会抛出ClassNotFoundException
:io
Class intClass1 = Class.forName("I"); Class intClass2 = Class.forName("int");
我一般使用像下面的代码得到基本类型的类对象:
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.isArray()
方法来检查:
Class stringArrayClass = Array.newInstance(String.class, 0).getClass(); System.out.println("is array: " + stringArrayClass.isArray());
一旦你得到数组的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);
示例代码将输出"java.lang.String",这是String[]
数组的组合类型。