Получение поля "длина" в массиве 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.

Из документации...

Длина массива не является частью его типа.