通过反射迭代数组

30

我正在进行一些反思工作,遇到了一个小问题。

我试图将对象打印到某个GUI树中,并且在通用方式下检测数组时遇到了问题。

我建议使用:

object instanceof Iterable

来完成任务,但它并不起作用,(显然只适用于Lists和Sets以及实现Iterable接口的类)

那么,如何才能识别出一个数组,例如Object[]long[]或者Long[]

谢谢

4个回答

76

如果您不仅想检查对象是否为数组,还想迭代它:

if (array.getClass().isArray()) {
    int length = Array.getLength(array);
    for (int i = 0; i < length; i ++) {
        Object arrayElement = Array.get(array, i);
        System.out.println(arrayElement);
    }
}

上述类是java.lang.reflect.Array


5
你的意思是Object.getClass().isArray()吗?

3
您可以做的事情
if (o instanceof Object[]) {
  Object[] array = (Object[]) o;
  // now access array.length or 
  // array.getClass().getComponentType()
}

这很好,但它不适用于原始数组类型。我想我找到了答案:object.getClass().isArray().. 哈哈 - Roman

0

首先,@Bozho的回答是完全正确的。

如果你想让这个更容易使用,我刚刚在我们的小型OSS实用程序molindo-utils中创建了一个方法,将未知类型的数组转换为Iterable:ArrayUtils.toIterable(Object)

这样,你就可以这样做:

// any array, e.g. int[], Object[], String[], ...
Object array = ...;
for (Object element : ArrayUtils.toIterable(array)) {
    // element of type Integer for int[]
    System.out.println(element);
}

请查看molindo-utils的README文件,了解如何获取molindo-utils,或者如果您愿意,随意复制代码,只要您认为合适。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接