Получение поля "длина" в массиве Java с использованием отражения
class Test {
public static void main(String[] args) throws Exception {
Test t = new Test();
System.out.println(t.field);
System.out.println(t.getClass().getField("field").get(t));
int[] ar = new int[23];
System.out.println(ar.length);
System.out.println(ar.getClass().getField("length").get(ar));
}
public int field = 10;
};
Когда я запускаю вышеуказанный код, я получаю следующий результат в командной строке -
10
10
23
Exception in thread "main" java.lang.NoSuchFieldException: length
at java.lang.Class.getField(Class.java:1520)
at Test.main(Test.java:9)
Почему мне не удается получить доступ к полю "длина" в массиве?
Ответы
Ответ 1
Я думаю, что это может быть ошибкой в реализации JVM. Вот мои рассуждения:
-
Согласно документации для Class.getField
, getField
должен, как часть (1) его алгоритма поиска, найти length
, если он был объявлен как общедоступное поле: "Если C объявляет публичное поле с указанным именем, это поле, которое должно быть отражено".
-
В соответствии с спецификацией Java Language каждый массив имеет length
, объявленный как" Общая длина конечного поля, которая содержит количество компонентов массива.
-
Поскольку это поле объявлено как имеющее имя length
, getField
должно либо выбросить SecurityException
как задокументировано, либо вернуть объект Field
.
Теперь интересно, метод Class.getFields
явно упоминает, что "Неявное поле длины для класса массива не отражается этим методом. должен использовать методы класса Array для управления массивами". Это не похоже на параллель getField
, поэтому это может быть неправильное чтение с моей стороны или просто плохая документация.
Надеюсь, это поможет!
Ответ 2
Существует специальный java.lang.reflect.Array
класс. length
не является нормальным полем. Для доступа к нему существует специальный метод getLength
.
Ответ 3
В Java массивы - это просто простые объекты. Объект не имеет поля, называемого длиной. Вот почему рефлексия терпит неудачу.
Подробнее о том, как массивы будут реализованы, см. http://docs.oracle.com/javase/specs/jls/se7/html/jls-10.html.
Из документации...
Длина массива не является частью его типа.