2010-08-04 66 views
8

我使用反射來檢索一個實例字段如此的原語的數組:使用反射來檢索未知類型

private int[] numbers = .... 

隨着字段對象,我可以檢查如果該字段包含的陣列如果是這樣,我想循環遍歷數組中的整數。因此,如果包含上述領域的對象被稱爲「富」,那麼我將有這樣的事情:

field.setAccessible(true); 
Object value = field.get(foo); 

上述數值變量將包含我的int數組。我如何像普通數組那樣處理這個對象並迭代它的值?

編輯:對不起,我錯過了上述我的故事的關鍵點。我以通用的方式進行上述操作,因此我不知道數組包含的是什麼原始數據。它可能是一個int []或long []等等。因此,在long []情況下顯然不適用於int []。哎呀!

回答

12

可以使用類java.lang.reflect.Array訪問的長度和數組的單個元素。 get方法應該以通用方式工作,可能會在其包裝對象中包裝基元。

+0

我可以看到get方法將檢索某個索引處的值,但是,如何獲取數組的長度? – digiarnie 2010-08-04 12:01:03

+3

@digiarnie,這個方法有點隱藏在其他getter之間的javadoc中,它是'Array.getLength(Object array)':) – 2010-08-04 12:41:31

+0

是的,這正是我想要的,是的,你是對的,它隱藏在所有那些其他的獲得者,我只是簡單地錯過了!謝謝! – digiarnie 2010-08-04 23:07:01

1

This page在「使用數組」部分下有很好的處理。

簡化(並從他們的array2例如改變類變量名;-),

int valuecast[] = (int[])value; 

似乎是你追求的。

編輯:在OP現在澄清,他不知道數組中的原始類型是否爲intlong,或什麼的。我相信解決這個問題的唯一方法是基於對原語類型的檢查(如Integer.TYPE或其他) - 一個if/else「樹」,然後在條件分支中進行相應的聲明和強制轉換,以標識所討論的類型。

0

,你可以將其轉換爲一個數組這樣

int[] a = (int[])value; 
+0

對不起,我錯過了我的問題中的一個關鍵點 - 我做了更正。 – digiarnie 2010-08-04 04:53:18

0

在Oracles Tutorial中提到這很容易用array.getClass().getComponentType()實現。這將返回數組中實例的類。

之後,您可以根據位於每個包裝器對象內的原始類進行檢查。例如:

if (array.getClass().getComponentType().equals(Boolean.TYPE)) { 
    boolean[] booleanArray = (boolean[]) array; 
}