Как я могу увидеть в Java, является ли объект массивом без использования отражения? И как я могу перебирать все элементы без использования отражения?
Я использую Google GWT, поэтому мне не разрешено использовать отражение :(
Я хотел бы реализовать следующие методы без использования рефлексии:
private boolean isArray(final Object obj) {
//??..
}
private String toString(final Object arrayObject) {
//??..
}
Кстати: я также не хочу использовать JavaScript, чтобы я мог использовать его в средах, отличных от GWT.
java
arrays
gwt
instanceof
Edbras
источник
источник
obj.getClass().getComponentType()
.Вы можете использовать
instanceof
.JLS 15.20.2 Оператор сравнения типов
instanceof
Это означает, что вы можете сделать что-то вроде этого:
Вы должны были бы проверить , если объект является
instanceof boolean[]
,byte[]
,short[]
,char[]
,int[]
,long[]
,float[]
,double[]
, илиObject[]
, если вы хотите , чтобы обнаружить все типы массива.Кроме того, an
int[][]
- этоinstanceof Object[]
, поэтому в зависимости от того, как вы хотите обрабатывать вложенные массивы, это может быть сложным.Для
toString
,java.util.Arrays
has atoString(int[])
и других перегрузок, которые вы можете использовать. Он также предназначенdeepToString(Object[])
для вложенных массивов.Он будет очень повторяющимся (но даже
java.util.Arrays
очень повторяющимся ), но так обстоит дело в Java с массивами.Смотрите также
источник
java.util.Arrays
это получается, да. Я вижу, что вы читали код, на который я ссылался.Можно получить доступ к каждому элементу массива отдельно, используя следующий код:
Обратите внимание, что нет необходимости знать, что это за базовый массив, так как это будет работать для любого массива.
источник
isArray()
уже был адекватно освещен в ответах, опубликованных за 4 года до этого.Не существует отношения подтипов между массивами примитивного типа или между массивом примитивного типа и массивом ссылочного типа. См. JLS 4.10.3 .
Следовательно, следующее неверно как тест, чтобы увидеть,
obj
является ли массив каким-либо типом :В частности, это не работает, если
obj
это одномерный массив примитивов. (Это действительно работает для примитивных массивов с более высокими измерениями, потому что все типы массивов являются подтипамиObject
. Но в данном случае это спорный вопрос.)Лучшее решение (для
isArray
части вопроса, связанной с массивом) зависит от того, что считается «использованием отражения».В GWT вызов
obj.getClass().isArray()
не считается использованием отражения 1 , так что это лучшее решение.В противном случае лучший способ выяснить, имеет ли объект тип массива, - использовать последовательность
instanceof
выражений.Вы также можете попробовать изменить имя класса объекта следующим образом, но вызов
obj.getClass()
граничит с отражением.1 - Точнее,
Class.isArray
метод указан как поддерживаемый GWT на этой странице .источник
Вы можете создать служебный класс, чтобы проверить, представляет ли класс какую-либо коллекцию , карту или массив
источник
Просто
obj instanceof Object[]
(проверено на JShell).источник