2014-11-20 78 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