java反射 数组类型_Java反射-数组
通過反射使用數組有時會比較棘手。特別是需要獲得一個特定類型數組的Class對象,如int[]等。本文將討論如何通過反射創建數組和獲得他們的Class對象。
注意:本文在閱讀Eyal Lupu的博客"Two Side Notes About Arrays and Reflection"后已更新,他的博客是本文第一個版本的評論。當前版本考慮了他的評論內容。
java.lang.reflect.Array
數組反射是通過類java.lang.reflect.Array實現的。不要把這個類與集合包的java.util.Arrays混淆,java.util.Arrays包含數組排序、轉換成集合等。
Creating Arrays
通過反射創建數組是java.lang.reflect.Array實現的。示例代碼如下:
int[] intArray = (int[]) Array.newInstance(int.class, 3);
示例代碼創建了一個int數組。Array.newInstance()方法的第一個參數int.class定義了數組每一個元素的類型。第二個參數定義數組的元素個數。
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對象。無反射代碼如下:
Class stringArrayClass = String[].class;
做這些使用Class.forName()并不是直接了當。例如,訪問原始int數組類對象代碼:
Class intArray = Class.forName("[I");
JVM使用小寫l代表int。左邊的[的意思是它是我有興趣的int數組的類對象。其他基本類型也是按照這個模式工作。
對于其他類型對象,需要使用稍微不同的符號:
Class stringArrayClass = Class.forName("[Ljava.lang.String;");
注意:[L在類名的左側,;在類名的右側。這段代碼的意思是給定類型的數組對象。
作為旁注,你不能使用Class.forName()獲得基本類型的類對象。下面的兩行代碼都會拋出ClassNotFoundException:
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.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[]數組的組合類型。
總結
以上是生活随笔為你收集整理的java反射 数组类型_Java反射-数组的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android webviewclien
- 下一篇: java美元兑换,(Java实现) 美元