Java反射-數組

經過反射使用數組有時會比較棘手。特別是須要得到一個特定類型數組的Class對象,如int[]等。本文將討論如何經過反射建立數組和得到他們的Class對象。
注意:本文在閱讀Eyal Lupu的博客"Two Side Notes About Arrays and Reflection" 後已更新,他的博客是本文第一個版本的評論。當前版本考慮了他的評論內容。java

java.lang.reflect.Array

數組反射是經過類java.lang.reflect.Array實現的。不要把這個類與集合包的java.util.Arrays 混淆,java.util.Arrays 包含數組排序、轉換成集合等。數組

Creating Arrays

經過反射建立數組是 java.lang.reflect.Array實現的。示例代碼以下:ide

int[] intArray = (int[]) Array.newInstance(int.class, 3);

示例代碼建立了一個int數組。Array.newInstance()方法的第一個參數int.class定義了數組每個元素的類型。第二個參數定義數組的元素個數。code

Accessing Arrays

能夠經過反射訪問數組元素。這是經過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

Obtaining the Class Object of an Array

在實現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()得到基本類型的類對象。下面的兩行代碼都會拋出ClassNotFoundExceptionio

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());

Obtaining the Component Type of an Array

一旦你得到數組的Class對象,你能夠經過Class.getComponentType() 訪問它的組合類型。組合類型是數組中的元素的類型。例如,int[]數組的組合類型是int.classClass對象。String[]數組的組合類型是java.lang.StringClass對象。
訪問數組的組合類型的代碼以下:

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

示例代碼將輸出"java.lang.String",這是String[]數組的組合類型。

相關文章
相關標籤/搜索