經過反射使用數組有時會比較棘手。特別是須要得到一個特定類型數組的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[]
數組的組合類型。