【譯】10. Java反射——數組


原文地址:http://tutorials.jenkov.com/java-reflection/arrays.html

===================================================================================== 

     用Java反射來處理數組有時候是技巧性很強的。特別是如果你需要獲取一個給定類型的數組的Class對象,像int[ ]等。本文將講述怎么用Java反射來創建數組和獲取數組的Class對象。
     下面是所涵蓋的主題列表:

  1. java.lang.reflect.Array 
  2. Creating Arrays 
  3. Accessing Arrays
  4. Obtaining the Class Object of an Array
  5. Obtaining the Component Type of an Array

===================================================================================== 

  • java.lang.reflect.Array 

     通過Java反射來處理數組需要用到java.lang.reflect.Array類。不要和Java集合中的java.util.Arrays類搞混淆了,它包含一些工具方法,像給數組排序、將數組轉換成集合等。
===================================================================================== 

  • Creating Arrays

     通過Java反射來創建數組需要用到java.lang.reflect.Array類。下面的這個例子中會展示如何去創建一個數組:

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

     這段代碼示例創建了一個int型的數組。Array.newInstance( )方法的第一個參數int.class指定了數組中的每個元素應該是什么類型。第二個參數聲明了該數組應該為多少個元素開辟空間。

===================================================================================== 

  • Accessing Arrays

   也可以通過Java反射來訪問數組中的元素。這是通過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項目中開發腳本語言時遇到一個問題,如何通過Java反射獲得數組的Class對象。不用反射你可以這樣做:

Class stringArrayClass = String[].class;

 

     對數組用Class.forName()不是很直觀。例如,你可以像這樣訪問基本類型數組的Class對象:

 

Class intArray = Class.forName("[I");

 

     JVM中用字母I代表int。在左邊加上[(左中括號)表示我比較感興趣的int數組的類。這對所有其他的基本類型同樣有效。

     對於對象,你需要用一個稍微不同的符號:  

Class stringArrayClass = Class.forName("[Ljava.lang.String;");

 

     注意類名左邊的[L和右邊的分號(;)。這表示一個你指定類型的對象的數組。

     附注,你不能用Class.forName()獲取基本類型的Class對象。下面的例子都會導致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);

 

     這個例子將會輸出String數組的元素類型"java.lang.String"。

 

 ========================================================================================

  • 目錄

 

  這是一個本教程到目前為止涵蓋的主題列表:     

 

 

 

  1. Java反射——引言
  2. Java反射——Class對象
  3. Java反射——構造函數
  4. Java反射——字段
  5. Java反射——方法
  6. Java反射——Getter和Setter
  7. Java反射——私有字段和私有方法
  8. Java反射——注解
  9. Java反射——泛型
  10. Java反射——數組
  11. Java反射——動態代理
  12. Java反射——類的動態加載和重新加載

 

 

 

(敬請期待下一篇翻譯)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM