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

почему я не могу получить доступ к полю "длина" в массиве?

3 ответов


Я думаю, что это может быть ошибка в реализации JVM. Вот мое рассуждение:--11-->

  1. по данным документация Class.getField, getField должен, как часть (1) своего алгоритма поиска, найти length если он был объявлен как общедоступное поле: "если C объявляет общедоступное поле с указанным именем, это поле должно быть отражено."

  2. по данным спецификация языка Java каждый массив имеет length объявлено как " общедоступная конечная длина поля,содержащая количество компонентов массива."

  3. так как это поле объявлено как имя length, getField должен либо бросить SecurityException как задокументировано, или должен вернуть , Так что это может быть непонимание с моей стороны или просто плохая документация.

    надеюсь, что это помогает!


есть специальные java.lang.reflect.Array класса. length не является нормальным полем. Для доступа к нему существует специальный метод getLength.


в Java массивы являются просто объектами. У объекта нет поля с именем длина. Вот почему отражение не работает.

пожалуйста, смотрите http://docs.oracle.com/javase/specs/jls/se7/html/jls-10.html для получения дополнительной информации о том, как реализуются массивы.

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

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