Страницы

Поиск по вопросам

пятница, 13 декабря 2019 г.

Как можно увидеть исходный код класса Array в Java?

#java #массивы


Известный факт что массив в Java это объект, а значит он должен иметь класс из которого
мы строим этот объект. По идее он должен быть финальным и иметь публичное поле length.
Как я понял имя его __Array__, но найти я его немогу. Может кто нибуть подскажет где
можно увидеть его исходные коды. Например интересно посмотреть на конструктор или на
то как переопределен метод clone().
    


Ответы

Ответ 1



... массив в Java это объект, а значит он должен иметь класс из которого мы строим этот объект. ... Да, это написано в спецификации Java: In the Java programming language, arrays are objects (§4.3.1), are dynamically created, and may be assigned to variables of type Object (§4.3.2). All methods of class Object may be invoked on an array. Дело в том, что спецификация описывает поведение массивов внутри языка Java. То, как это поведение будет реализовано к самому языку не относится. Виртуальная машина может симулировать поведение массивов любым необходимым способом. По идее он должен быть финальным и иметь публичное поле length. Как я понял имя его __Array__ ... JVM может реализовать такой класс, но это необязательно. На практике происходит по-другому. Во-первых код компилируется в байт-код. Компилятор преобразовывает работу с массивами в специальные инструкции байт-кода. Для создания массива используется newarray и anewarray, для length — инструкция arraylength. Инструкции определены в спецификации виртуальной машины Java. Проверить это можно так: скомпилируем простой класс: public class Main { public static void main(String[] args) { int[] arr = new int[3]; System.out.println(arr.length); } } и прочитаем байт-код (javap -c Main.class): public static void main(java.lang.String[]); Code: 0: iconst_3 1: newarray int 3: astore_1 4: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream; 7: aload_1 8: arraylength 9: invokevirtual #3 // Method java/io/PrintStream.println:(I)V 12: return Как видно из байт-кода на этом этапе никаких обращений к специальным классам не происходит. Вместо этого компилятор заменил создание массива на newarray. Так же нет обращения к полю length. Вместо этого проставлена инструкция arraylength. При исполнении кода JVM будет обрабатывать уже готовые инструкции, создавать свои внутренние массивы и симулировать для них работу методов Object. Примеры исходного кода можно посмотреть в OpenJDK: можете поискать вышеприведенные инструкции в обработчике инструкций (bytecodeInterpreter); либо посмотреть код C++ класса arrayKlass.

Ответ 2



Массивы - часть JVM, то есть встроен в нее. Если хочешь увидеть его имплементацию, тебе нужно изучать исходники твоей JVM. Если знаешь английский, можешь почитать про массивы вот тут: https://docs.oracle.com/javase/specs/jls/se8/html/jls-10.html и вот https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.10

Комментариев нет:

Отправить комментарий