Этот класс довольно эзотеричен - большинству применений массивов известен тип массива, поэтому этот класс обычно наиболее полезен при реализации кода, который обрабатывает массивы в общем.
Не существует суперкласса для всех массивов, поэтому нет единого способа доступа к элементам или размеру массива независимо от его типа. java.lang.reflect.Array
заполняет этот пробел и позволяет обращаться к массиву одинаково, независимо от типа. Например, чтобы получить значение по заданному индексу из любого массива (возвращенного как объект).
Это параметрический полиморфизм . Конечно, вы могли бы написать это самостоятельно, если знаете тип - вы просто разыгрываете. Если вы не знаете тип массива или он может быть нескольких типов, вы должны проверить возможности и привести его соответствующим образом - это то, что делает код в reflect.Array
.
РЕДАКТИРОВАТЬ: в ответ на комментарий. Подумайте, как бы вы решили эту проблему - как посчитать, сколько раз значение дублируется в массиве. Без класса Array, не зависящего от типа, это было бы невозможно закодировать без явного приведения массива, поэтому вам потребуется отдельная функция для каждого типа массива. Здесь у нас есть одна функция, которая обрабатывает любой тип массива.
public Map<Object, Integer> countDuplicates(Object anArray)
{
if (!anArray.getClass().isArray())
throw new IllegalArgumentException("anArray is not an array");
Map<Object,Integer> dedup = new HashMap<Object,Integer>();
int length = Array.getLength(anArray);
for (int i=0; i<length; i++)
{
Object value = Array.get(anArray, i);
Integer count = dedup.get(value);
dedup.put(value, count==null ? 1 : count+1);
}
return dedup;
}
EDIT2: Относительно методов get * () и set * (). Ссылка на исходный код выше ссылается на Apache Harmony. Реализация там не придерживается Sun Javadocs. Например, из метода getInt
@throws IllegalArgumentException If the specified object is not an array,
or if the indexed element cannot be converted to the return type
by an identity or widening conversion
Это означает, что фактический массив может быть byte[]
, short[]
или int[]
. Это не относится к реализации Harmony, которая занимает всего int[]
. (Между прочим, реализация Sun использует нативные методы для большей части класса Array.) Методы get * () и set * () существуют по той же причине, что и get()
, getLength()
- для обеспечения (слабо) type- доступ к массиву агностиков.
Не совсем то, что вам нужно использовать каждый день, но я думаю, что это обеспечивает ценность для тех, кто в этом нуждается.