通过reflection迭代数组
我正在做一些反思工作并且遇到一个小问题。
我正在尝试将对象打印到某个GUI树,并且以通用方式检测数组有问题。
我建议:
对象instanceof Iterable
会完成这项工作,但事实并非如此,(显然只适用于Lists和Set以及任何实现它的人。)
那我怎么会认出一个Array Some Object[]
,或long[]
或Long[]
..?
谢谢
如果您不想只检查对象是否是数组,还要迭代它:
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
)
你的意思是Object.getClass().isArray()
?
你可以做
if (o instanceof Object[]) { Object[] array = (Object[]) o; // now access array.length or // array.getClass().getComponentType() }
首先,@ Bozho的回答是完全正确的。
如果你想让它更容易使用,我刚刚在我们的小OSS实用程序molindo-utils中创建了一个方法, 它将一个未知类型的数组转换为Iterable: ArrayUtils.toIterable(Object)
这样,你可以这样做:
// any array, eg 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的 README,如果您愿意,可以随意复制代码,就像您认为合适一样。