Как работает класс array в Java?

в Java array является классом и расширяет объект. Мне любопытно узнать об этом специальном классе array. Я нигде не нахожу определения класса. Делать getClass().getName () дает странный результат.

String[] array = new String[]{"one","two"};
System.out.println(array.getClass().getName()); // prints [Ljava.lang.String;

Я хочу понять, как работает под капотом. Определение класса Array жестко в JVM?

любые ресурсы, книги, ссылки на это будут полезны.

спасибо.

4 ответов


да, в основном массивы-это то, о чем VM знает близко, как и примитивные типы. Существуют конкретные инструкции байт-кода для работы с массивами - создание их, индексирование в них и т. д.

Что касается ресурсов, чтобы узнать больше -спецификация JVM вероятно, лучшая отправная точка. В разделе 7.9 приведены некоторые примеры байт-кода, работающего с массивами.


относительно имен классов массивов

Class.getName четко указывает эти "веселые" такие имена:

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

если этот объект класса представляет примитивный тип или void, то возвращается имя String равно языку Java ключевое слово, соответствующее примитивному типу или void.

если этот объект класса представляет класс массивов, то внутренняя форма имени состоит из имени типа элемента, которому предшествует один или несколько '[' символы, представляющие глубину вложения массива. Кодировка имен типов элементов выглядит следующим образом:

Element Type        Encoding
boolean             Z
byte                B
char                C
double              D
float               F
int                 I
long                J
short               S 
class or interface  Lclassname;

относительно членов класса array

массив JLS 10.7 члены

члены типа массива являются следующие:

  • на public final field length, который содержит количество компонентов массива (длина может быть положительной или нулевой)
  • на public method clone, который переопределяет метод с таким же именем в классе Object и не бросает никаких проверенных исключений
  • все члены, унаследованные от class Object; единственный метод Object это не наследуется, это его clone метод

вопросы


Да, есть синтетические Class в JVM, представляющем массив каждого возможного типа (например,Integer[].class). Есть один для каждого примитивного типа (например,int[].class). Я не думаю, что это что-то, что имеет определение, например исходный файл, где угодно. Они ведут себя так, как и ожидалось;Number[].class присваиваем Integer[].class например.

у него нет специальных методов, если это то, что вы имеете в виду, и специального исходного файла нигде. Я даже не думаю, что length поле этого массива типы have также считаются определенными в этом классе, хотя я признаю, что не проверял; это специальный случай VM.

JLS 10.8 определяет это.


спецификация виртуальной машины Java объясняет в разделе 4.2, какие имена, такие как [Ljava.lang.String; mean. См.: 4.2 внутренняя форма полных имен классов и интерфейсов.

в этом случае [ означает, что это тип массива, и Lclassname; означает, что это массив ссылок на объекты типа classname.

так [Ljava.lang.String; означает String[].