Java Reflection(十):數組

來源:互聯網
上載者:User

標籤:

轉載自並發編程網 – ifeve.com

內容索引
java.lang.reflect.Array
建立一個數組
訪問一個數組
擷取數組的Class對象
擷取數組的成員類型

利用反射機制來處理數組會有點棘手。尤其是當你想要獲得一個數組的Class對象,比如int[]等等。本節會討論通過反射機制建立數組和如何擷取數組的Class對象。

注意:在閱讀Eyal Lupu的部落格文章“Two Side Notes About Arrays and Reflection”之後對本文的內容做了更新。目前這個版本參考了這篇博文裡面的內容。

java.lang.reflect.Array

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

建立一個數組

Java反射機制通過java.lang.reflect.Array類來建立數組。下面是一個如何建立數組的例子:

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

這個例子建立一個int類型的數組。Array.newInstance()方法的第一個參數表示了我們要建立一個什麼類型的數組。第二個參數表示了這個數組的空間是多大。

訪問一個數組

通過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] = 123intArray[1] = 456intArray[2] = 789

擷取數組的Class對象

在我編寫Butterfly DI Container的指令碼語言時,當我想通過反射擷取數組的Class對象時遇到了一點麻煩。如果不通過反射的話你可以這樣來擷取數組的Class對象:

Class stringArrayClass = String[].class;

如果使用Class.forName()方法來擷取Class對象則不是那麼簡單。比如你可以像這樣來獲得一個原生資料類型(primitive)int數組的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");

我通常會用下面這個方法來擷取普通對象以及原生對象的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對象,你就有辦法輕鬆的擷取到它的數組的Class對象,你可以通過指定的類型建立一個空的數組,然後通過這個空的數組來擷取數組的Class對象。這樣做有點討巧,不過很有效。如下例:

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

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

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

擷取數組的成員類型

一旦你擷取了一個數組的Class對象,你就可以通過Class.getComponentType()方法擷取這個數組的成員類型。成員類型就是數組儲存的資料類型。例如,數組int[]的成員類型就是一個Class對象int.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”代表這個數組的成員類型是字串。

原文地址 作者: Jakob Jenkov 譯者:葉文海([email protected])

Java Reflection(十):數組

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.