鍍金池/ 教程/ Java/ Java 數(shù)組
Java 數(shù)組
Java 訪問器
Java 泛型
Java 方法
指南
Java 動態(tài)代理
Java 變量
Java 注解
Java 私有變量和私有方法
Java 動態(tài)類加載與重載
java 類
Java 構(gòu)造器

Java 數(shù)組

原文地址

作者: Jakob Jenkov 譯者:葉文海(yewenhai@gmail.com)

內(nèi)容索引

  1. java.lang.reflect.Array
  2. 創(chuàng)建一個數(shù)組
  3. 訪問一個數(shù)組
  4. 獲取數(shù)組的 Class 對象
  5. 獲取數(shù)組的成員類型

利用反射機(jī)制來處理數(shù)組會有點(diǎn)棘手。尤其是當(dāng)你想要獲得一個數(shù)組的 Class 對象,比如 int[] 等等。本節(jié)會討論通過反射機(jī)制創(chuàng)建數(shù)組和如何獲取數(shù)組的 Class 對象。

注意:在閱讀 Eyal Lupu 的博客文章“Two Side Notes About Arrays and Reflection”之后對本文的內(nèi)容做了更新。目前這個版本參考了這篇博文里面的內(nèi)容。

java.lang.reflect.Array

Java 反射機(jī)制通過 java.lang.reflect.Array 這個類來處理數(shù)組。不要把這個類與 Java 集合套件(Collections suite)中的 java.util.Arrays 混淆, java.util.Arrays 是一個提供了遍歷數(shù)組,將數(shù)組轉(zhuǎn)化為集合等工具方法的類。

創(chuàng)建一個數(shù)組

Java 反射機(jī)制通過 java.lang.reflect.Array 類來創(chuàng)建數(shù)組。下面是一個如何創(chuàng)建數(shù)組的例子:

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

這個例子創(chuàng)建一個 int 類型的數(shù)組。Array.newInstance()方法的第一個參數(shù)表示了我們要創(chuàng)建一個什么類型的數(shù)組。第二個參數(shù)表示了這個數(shù)組的空間是多大。

訪問一個數(shù)組

通過 Java 反射機(jī)制同樣可以訪問數(shù)組中的元素。具體可以使用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

獲取數(shù)組的 Class 對象

在我編寫 Butterfly DI Container 的腳本語言時,當(dāng)我想通過反射獲取數(shù)組的 Class 對象時遇到了一點(diǎn)麻煩。如果不通過反射的話你可以這樣來獲取數(shù)組的 Class 對象:

Class stringArrayClass = String[].class;

如果使用 Class.forName()方法來獲取 Class 對象則不是那么簡單。比如你可以像這樣來獲得一個原生數(shù)據(jù)類型(primitive)int 數(shù)組的 Class 對象:

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

在 JVM 中字母 I 代表 int 類型,左邊的‘[’代表我想要的是一個int類型的數(shù)組,這個規(guī)則同樣適用于其他的原生數(shù)據(jù)類型。 對于普通對象類型的數(shù)組有一點(diǎn)細(xì)微的不同:

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

注意‘[L’的右邊是類名,類名的右邊是一個‘;’符號。這個的含義是一個指定類型的數(shù)組。 需要注意的是,你不能通過 Class.forName()方法獲取一個原生數(shù)據(jù)類型的 Class 對象。下面這兩個例子都會報 ClassNotFoundException:

Class intClass1 = Class.forName("I");
Class intClass2 = Class.forName("int");

我通常會用下面這個方法來獲取普通對象以及原生對象的 Class 對象:

public Class getClass(String className){
  if("int" .equals(className)) return int .class;
  if("long".equals(className)) return long.class;
  ...
  return Class.forName(className);
}

一旦你獲取了類型的 Class 對象,你就有辦法輕松的獲取到它的數(shù)組的 Class 對象,你可以通過指定的類型創(chuàng)建一個空的數(shù)組,然后通過這個空的數(shù)組來獲取數(shù)組的 Class 對象。這樣做有點(diǎn)討巧,不過很有效。如下例:

Class theClass = getClass(theClassName);
Class stringArrayClass = Array.newInstance(theClass, 0).getClass();

這是一個特別的方式來獲取指定類型的指定數(shù)組的Class對象。無需使用類名或其他方式來獲取這個 Class 對象。 為了確保 Class 對象是不是代表一個數(shù)組,你可以使用 Class.isArray()方法來進(jìn)行校驗:

Class stringArrayClass = Array.newInstance(String.class, 0).getClass();
System.out.println("is array: " + stringArrayClass.isArray());

獲取數(shù)組的成員類型

一旦你獲取了一個數(shù)組的 Class 對象,你就可以通過 Class.getComponentType()方法獲取這個數(shù)組的成員類型。成員類型就是數(shù)組存儲的數(shù)據(jù)類型。例如,數(shù)組 int[]的成員類型就是一個 Class 對象 int.class。String[]的成員類型就是 java.lang.String 類的 Class 對象。 下面是一個訪問數(shù)組成員類型的例子:

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

下面這個例子會打印“java.lang.String”代表這個數(shù)組的成員類型是字符串。

本文鏈接地址: Java Reflection(十):數(shù)組