使用反射来检索未知类型的基元数组

时间:2010-08-04 04:46:44

标签: java reflection

我正在使用反射来检索实例字段,例如:

private int[] numbers = ....

使用field对象,我可以检查字段是否包含数组,如果有,我想循环遍历数组中的int。因此,如果包含上述字段的对象被称为“foo”,那么我会这样:

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

上面的值变量将包含我的int数组。如何将该对象视为常规数组并迭代其值?

编辑:抱歉,我错过了上述故事的关键点。我正在以通用方式执行上述操作,因此我不知道数组包含什么原语。它可能是一个int []或long []等。所以强制转换为int []在long []情况下是行不通的。糟糕!

4 个答案:

答案 0 :(得分:12)

您可以使用类java.lang.reflect.Array来访问数组的长度和单个元素。 get方法应该以通用方式工作,可能在其包装器对象中包装基元。

答案 1 :(得分:1)

This page在“使用阵列”部分下有一个很好的处理。

array2示例类

简化(和更改变量名称;-)
int valuecast[] = (int[])value;

似乎就是你所追求的。

编辑:OP现在澄清他不知道数组中的基元类型是intlong还是其他什么。我认为解决这个问题的唯一方法是基于对基元类型的检查if/else“树”(如,Integer.TYPE或其他) - 然后是相应的声明并在条件的中强制转换标识相关类型的分支。

答案 2 :(得分:0)

你可以把它投射到像这样的数组

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

答案 3 :(得分:0)

在Oracles Tutorial中提到这可以通过array.getClass().getComponentType()轻松实现。这将返回数组中实例的类。

之后,您可以针对位于每个包装器对象内的基元类进行检查。例如:

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