2010-02-04 77 views
24

我正在做一些反射工作并遇到一些小问题。通过反射对数组进行迭代

我试图打印对象到一些GUI树,并以通用的方式检测数组时遇到问题。

我建议:

对象的instanceof可迭代

将使工作,但它没有,(显然只适用于列表和设置与谁实现它。)

那么,我怎么会认识到阵列一些Object[],或long[]Long[] ..?

感谢

回答

58

如果你不只是要检查的对象是否是一个数组,而且要重复它:

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

2

你可以做

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

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

5

你的意思是Object.getClass().isArray()

0

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

如果你想这是比较容易可用,我刚刚建立在我们little OSS utility molindo-utils的方法,轮流未知类型的数组到一个可迭代: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的自述文件,只要您认为合适。