我正在做一些反思工作并且遇到一些问题。
我正在尝试将对象打印到某个GUI树,并且以通用方式检测数组时出现问题。
我建议:
对象instanceof Iterable
会完成这项工作,但事实并非如此(显然只适用于Lists和Set以及任何实现它的人。)
那我怎么会认出一些Object[]
,或long[]
或Long[]
......?
谢谢
答案 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,或者根据需要随意复制代码,就像您认为合适一样。