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

104
20 сентября 2019, 05:30

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

Answer 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.
Answer 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

READ ALSO
Свой источник GPS координат

Свой источник GPS координат

Устройство работает на Android 44

170
api json запись на сервер

api json запись на сервер

Есть таблица Report и таблица Recipe, которые имеют стандартную всязь один к многим, те

112
Удалене объектов с одинаковыми полями

Удалене объектов с одинаковыми полями

У меня ест ькласс Human c полями

162