繁体   English   中英

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

[英]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现在澄清他不知道数组中的原始类型是intlong还是其他。 我认为处理这个问题的唯一方法是基于对原语类型的检查(如, 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM