[英]Using reflection to retrieve an array of primitives of an unknown type
我正在使用反射来检索实例字段,例如:
private int[] numbers = ....
使用field对象,我可以检查字段是否包含数组,如果有,我想循环遍历数组中的int。 因此,如果包含上述字段的对象被称为“foo”,那么我会有这样的事情:
field.setAccessible(true);
Object value = field.get(foo);
上面的值变量将包含我的int数组。 如何将该对象视为常规数组并迭代其值?
编辑:抱歉,我错过了上述故事的关键点。 我正在以通用方式执行上述操作,因此我不知道数组包含什么原语。 它可能是一个int []或long []等。所以强制转换为int []在long []情况下是行不通的。 哎呀!
您可以使用java.lang.reflect.Array
类来访问数组的长度和单个元素。 get
方法应该以通用方式工作,可能在其包装器对象中包装原语。
此页面在“使用阵列”部分下有一个很好的处理。
从array2
示例类中简化(和更改变量名称;-),
int valuecast[] = (int[])value;
似乎是你所追求的。
编辑 :OP现在澄清他不知道数组中的原始类型是int
, long
还是其他。 我认为处理这个问题的唯一方法是基于对原语类型的检查(如, Integer.TYPE
或其他)的if/else
“树” - 接着是相应的声明并在条件的分支中强制转换,以识别输入有问题。
在Oracles Tutorial中提到过,使用array.getClass().getComponentType()
可以轻松实现。 这将返回数组中实例的类。
然后,您可以针对位于每个包装器对象内的基元类进行检查。 例如:
if (array.getClass().getComponentType().equals(Boolean.TYPE)) {
boolean[] booleanArray = (boolean[]) array;
}
你可以把它投射到像这样的数组
int[] a = (int[])value;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.