通过反射迭代数组

时间:2010-02-04 14:35:33

标签: java reflection

我正在做一些反思工作并且遇到一些问题。

我正在尝试将对象打印到某个GUI树,并且以通用方式检测数组时出现问题。

我建议:

  

对象instanceof Iterable

会完成这项工作,但事实并非如此(显然只适用于Lists和Set以及任何实现它的人。)

那我怎么会认出一些Object[],或long[]Long[] ......?

谢谢

4 个答案:

答案 0 :(得分:61)

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

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

答案 1 :(得分:5)

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

答案 2 :(得分:2)

你可以做到

if (o instanceof Object[]) {
  Object[] array = (Object[]) o;
  // now access array.length or 
  // array.getClass().getComponentType()
}

答案 3 :(得分:0)

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

如果您想让它更容易使用,我刚刚在little OSS utility 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的自述文件,了解如何获取molindo-utils,或者根据需要随意复制代码,就像您认为合适一样。