我正在使用反射来检索实例字段,例如:
private int[] numbers = ....
使用field对象,我可以检查字段是否包含数组,如果有,我想循环遍历数组中的int。因此,如果包含上述字段的对象被称为“foo”,那么我会这样:
field.setAccessible(true);
Object value = field.get(foo);
上面的值变量将包含我的int数组。如何将该对象视为常规数组并迭代其值?
编辑:抱歉,我错过了上述故事的关键点。我正在以通用方式执行上述操作,因此我不知道数组包含什么原语。它可能是一个int []或long []等。所以强制转换为int []在long []情况下是行不通的。糟糕!
答案 0 :(得分:12)
您可以使用类java.lang.reflect.Array
来访问数组的长度和单个元素。 get
方法应该以通用方式工作,可能在其包装器对象中包装基元。
答案 1 :(得分:1)
This page在“使用阵列”部分下有一个很好的处理。
从array2
示例类
int valuecast[] = (int[])value;
似乎就是你所追求的。
编辑:OP现在澄清他不知道数组中的基元类型是int
,long
还是其他什么。我认为解决这个问题的唯一方法是基于对基元类型的检查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;
}