Использование отражения для получения массива примитивов неизвестного типа - PullRequest
8 голосов
/ 04 августа 2010

Я использую отражение для извлечения поля экземпляра, например:

private int[] numbers = ....

С помощью объекта поля я могу проверить, содержит ли поле массив, и если да, то я бы хотелЗацикливание на int в массиве.Поэтому, если объект, содержащий указанное выше поле, называется «foo», то у меня будет что-то вроде этого:

field.setAccessible(true);
Object value = field.get(foo);

Переменная значения выше будет содержать мой массив целых чисел.Как мне обработать этот объект как обычный массив и перебрать его значения?

Редактировать: извините, я упустил важный момент в моей истории выше.Я делаю вышеупомянутое в общем виде, поэтому я не знаю, какой примитив содержится в массиве.Это может быть int [] или long [] и т. Д. Поэтому приведение к int [] не будет работать в случае long [], очевидно.ой!

Ответы [ 4 ]

12 голосов
/ 04 августа 2010

Вы можете использовать класс java.lang.reflect.Array для доступа к длине и отдельным элементам массива.Метод get должен работать универсальным образом, возможно, оборачивая примитивы в свои объекты-оболочки.

1 голос
/ 04 августа 2010

На этой странице есть хорошая обработка в разделе "Использование массивов".

Упрощение (и изменение имен переменных ;-) из их array2 примера класса,

int valuecast[] = (int[])value;

кажется, что вы ищете.

Редактировать : ОП теперь поясняет, что он не знает, является ли тип примитива в массиве int, long или каким-либо другим. Я считаю, что единственный способ справиться с этим - это if/else «дерево», основанное на проверках типа примитива (как, например, Integer.TYPE или что-то еще), за которым следует соответствующее объявление и приведение в условной ветви, которая идентифицирует введите вопрос.

0 голосов
/ 11 сентября 2015

Упоминается в оракулах Учебное пособие Это легко достижимо с array.getClass().getComponentType().Это возвращает класс экземпляров в массиве.

После этого вы можете сравнить его с классом примитивов, расположенным внутри каждого объекта-оболочки.Например:

if (array.getClass().getComponentType().equals(Boolean.TYPE)) {
    boolean[] booleanArray =  (boolean[]) array;
}
0 голосов
/ 04 августа 2010

вы можете привести его к массиву, как этот

int[] a = (int[])value;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...