Как я могу видеть в Java, если Объект является массивом, не используя отражение? И как я могу выполнить итерации через все объекты, не используя отражение?
Я использую Google GWT, таким образом, мне не разрешают использовать отражение :(
Я хотел бы реализовать следующие методы, не используя refelection:
private boolean isArray(final Object obj) {
//??..
}
private String toString(final Object arrayObject) {
//??..
}
BTW: и при этом я не хочу использовать JavaScript, таким образом, что я могу использовать его в non-GWT средах.
Вы можете использовать Class.isArray ()
public static boolean isArray(Object obj)
{
return obj!=null && obj.getClass().isArray();
}
Это работает как для объектных, так и для примитивных массивов типов.
Для toString см. Arrays.toString
. Вам нужно будет проверить тип массива и вызвать соответствующий метод toString
.
Вы можете использовать instanceof
.
instanceof
RelationalExpression: RelationalExpression instanceof ReferenceType
Во время выполнения результат
instanceof
оператористина
, если значение RelationalExpression неnull
, и ссылка может быть приведена к ReferenceType без повышения] ClassCastException
. В противном случае результат будетложным
.
Это означает, что вы можете сделать что-то вроде этого:
Object o = new int[] { 1,2 };
System.out.println(o instanceof int[]); // prints "true"
Вам нужно будет проверить, является ли объект экземпляром логического []
, байтом []
, short []
, char []
, int []
, long []
, float []
, double []
или Object []
, если вы хотите обнаружить все типы массивов.
Кроме того, int [] []
- это instanceof Object []
, поэтому в зависимости от того, как вы хотите обрабатывать вложенные массивы, это может быть сложно.
Для toString
, java.util.Arrays
имеет toString (int [])
и другие перегрузки, которые вы можете использовать. Он также имеет deepToString (Object [])
для вложенных массивов.
public String toString(Object arr) {
if (arr instanceof int[]) {
return Arrays.toString((int[]) arr);
} else //...
}
Он будет очень повторяющимся (но даже java.util.Arrays
очень повторяющийся ), но именно так обстоит дело в Java с массивами.
Между массивами примитивного типа или между массивом примитивного типа и массивом ссылочного типа не существует отношения подтипирования. См. JLS 4.10.3.
Поэтому следующий тест неверен в качестве проверки, является ли obj
массивом любого типа:
// INCORRECT!
public boolean isArray(final Object obj) {
return obj instanceof Object[];
}
В частности, он не работает, если obj
является одномерным массивом примитивов. (Это работает для массивов примитивов с большей размерностью, потому что все типы массивов являются подтипами Object
. Но в данном случае это спорно.)
Я использую Google GWT, поэтому мне не разрешено использовать отражение :(
Лучшее решение (для части вопроса о массиве isArray
) зависит от того, что считать "использованием отражения".
В GWT вызов obj.getClass().isArray()
не считается использованием отражения1, поэтому это лучшее решение.
В противном случае лучшим способом выяснить, имеет ли объект тип массива, является использование последовательности выражений instanceof
.
public boolean isArray(final Object obj) {
return obj instanceof Object[] || obj instanceof boolean[] ||
obj instanceof byte[] || obj instanceof short[] ||
obj instanceof char[] || obj instanceof int[] ||
obj instanceof long[] || obj instanceof float[] || obj instanceof double[] ||
obj instanceof double[];
}
Вы также можете попробовать изменить имя класса объекта следующим образом, но вызов obj.getClass()
граничит с рефлексией.
public boolean isArray(final Object obj) {
return obj.getClass().toString().charAt(0) == '[';
}
1 - Более точно, метод Class.isArray
перечислен как поддерживаемый GWT на этой странице.