Как работает класс массива в Java? - PullRequest
7 голосов
/ 26 мая 2010

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

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

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

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

Спасибо.

Ответы [ 4 ]

7 голосов
/ 26 мая 2010

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

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

6 голосов
/ 26 мая 2010

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

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;

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

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

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

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

Похожие вопросы

1 голос
/ 26 мая 2010

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

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

То есть [Ljava.lang.String; означает String[].

1 голос
/ 26 мая 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...