Итерация по массивам путем отражения
Я делаю некоторые размышления и прихожу к небольшой проблеме.
Я пытаюсь напечатать объекты в каком-нибудь дереве графического интерфейса и обнаруживать проблемы с массивами в общем виде.
Я предположил, что:
object instanceof Iterable
Сделал бы работу, но это не так (очевидно, применимо только к спискам и множеству и тому, кто ее реализует.)
Итак, как я могу распознать Array Some Object[]
, Or long[]
или long[]
..?
Спасибо
Ответы
Ответ 1
Если вы не хотите только проверять, является ли объект массивом, но также итерировать его:
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
Вы имеете в виду Object.getClass().isArray()
?
Ответ 3
Вы можете сделать
if (o instanceof Object[]) {
Object[] array = (Object[]) o;
// now access array.length or
// array.getClass().getComponentType()
}
Ответ 4
Прежде всего, ответ @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);
}
См. README molindo-utils о том, как получить молиндо-utils или не стесняйтесь скопировать код, если хотите, так же, как вы видите подходит.