2014-11-20 107 views
-1

我有以下類:爪哇 - 如何通過反射檢查數組長度(場類)

public class GeneralClass 
{ 
    public int x; 
    public int[] arr = new int[3]; 
} 

與以下邏輯:

public void loadClass(Class cls) {   
    Field[] fields = cls.getDeclaredFields(); 
    for (Field field : fields) {    
      if (field.getType().isArray()) { 
       // How can I print the array length ? 
      } 
    } 
} 

我怎麼能知道什麼是數組的大小(長度)?

回答

8

您可以使用Array.getLength,但是你需要提供一個具體的實例所以這就是爲什麼我用cls.newInstance()(這是假設有一個無參數的構造函數)

public static void loadClass(Class<?> cls) throws IllegalArgumentException, IllegalAccessException, InstantiationException {   
     Field[] fields = cls.getDeclaredFields(); 
     for (Field field : fields) {  
       if (field.getType().isArray()) { 
        int length = Array.getLength(field.get(cls.newInstance())); 
        System.out.println(length); 
       } 
     } 
    } 

注意,如果該字段是靜態的你可以得到它在一個級別,所以int length = Array.getLength(field.get(null));將工作。

+0

七個答案,只有兩個能夠理解問題提出的問題,只有一個提供瞭解決方案。榮譽。 – 2014-11-20 19:40:26

+0

@DavidConrad可怕,不是嗎? – Seelenvirtuose 2014-11-20 19:43:06

0

簡單

System.out.println(field.length); 
+0

有沒有長度在字段類 – user3668129 2014-11-20 19:28:53

+0

OP是詢問反射訪問。 – Seelenvirtuose 2014-11-20 19:36:27

0

找到一個數組的長度的方法是fields.length

+0

你試過了嗎? 字段中沒有「length」屬性(字段類型爲Field) – user3668129 2014-11-20 19:31:57

+0

@ user3668129語法爲'.length'以訪問數組的* length *。由你的代碼給出,'fields'是包含'Field'對象的數組,所以'fields'就是你感興趣的。 – 2014-11-20 19:35:25

+0

不,'arr'是Opie感興趣的。 – 2014-11-20 19:38:28

2

的陣列d arr屬於該類的一個實例,因此它的長度不能由經由反射獲得的Field對象確定,因爲這實質上是類級別元數據。

+0

但是我們聲明瞭數組的大小上課? (這不是enogth)? – user3668129 2014-11-20 19:34:49

+0

這是非常正確的答案。 +1 – Seelenvirtuose 2014-11-20 19:36:00

+0

@ user3668129閱讀答案,特別是這一部分:「[...]屬於班級的_instance_」。在實例級別上,您可以讀取數組的大小(使用反射方法),而在類級別上則不能。 – Seelenvirtuose 2014-11-20 19:38:04