Как работает класс 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[]
.