Подтвердить что ты не робот

Итерация по массивам путем отражения

Я делаю некоторые размышления и прихожу к небольшой проблеме.

Я пытаюсь напечатать объекты в каком-нибудь дереве графического интерфейса и обнаруживать проблемы с массивами в общем виде.

Я предположил, что:

object instanceof Iterable

Сделал бы работу, но это не так (очевидно, применимо только к спискам и множеству и тому, кто ее реализует.)

Итак, как я могу распознать Array Some Object[], Or long[] или long[]..?

Спасибо

4b9b3361

Ответ 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 или не стесняйтесь скопировать код, если хотите, так же, как вы видите подходит.