2010-08-04 37 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; 
}