Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Пул констант

Anna | 1.06.2014 | нет комментариев
Многие знают, что в всяком .class-файле есть восхитительная конструкция данных, которая именуется пулом констант. Но вдалеке не всякий Java-разработчик, глядя на исходник, сумеет даже приблизительно оценить, сколько констант будет сделано в пуле.

Возьмём, к примеру, такой код:

System.out.println("Hello World!");

Он транслируется в три инструкции байткода: getstatic (для загрузки статического поля System.out), ldc (для загрузки константной строки «Hello World!») и invokevirtual (для выполнения виртуальной функции println). Испробуйте прикинуть, сколько констант необходимо для того, Дабы данный код работал.

Оказывается, эта строка использует 14 констант, которые схематично дозволено изобразить таким образом:

Как мы видим, множество констант являются ссылками на другие константы. У всякой константы есть тип, значение и номер, по которому на неё дозволено сослаться. Вот базовые типы, которые ни на что не ссылаются:

  • Integer — целое число. На них ссылаются из кода, там, где число понадобилось. Числа от -32768 до 32767 компилятор сюда не складывает: их дозволено очевидно указать в коде с поддержкой инструкций iconst_x, bipush и sipush.
  • Long — длинное целое. По историческим причинам занимает две позиции в пуле констант (то есть у дальнейшей константы номер на два огромнее). Сэкономить дозволено только на 0L и 1L с поддержкой lconst_x; 2L теснее попадает в пул.
  • Float — вещественное одинарной точности. Особые инструкции fconst_x есть для 0.0f, 1.0f и 2.0f; остальные используемые числа попадают в пул.
  • Double — вещественное двойственный точности. Как и Long, занимает две позиции в пуле. Только числа 0.0 и 1.0 дозволено применять без пула с поддержкой инструкций dconst_x.
  • Utf8 — строковой литерал в кодировке Utf8. Максимальная длина не превышает 65535 байт (символов, безусловно, может быть поменьше). Как раз на эти литералы ссылаются из других констант Почаще каждого.

А вот некоторые из ссылочных типов:

  • String — строка. Содержит ссылку на константу типа Utf8. Если вы используете в коде строку, вы ссылаетесь на константу типа String. Выглядит как лишняя сущность, но есть.
  • NameAndType — константа, описывающая имя и тип поля либо способа. Содержит две ссылки на Utf8-константы с именем и типом.
  • Class — константа, описывающая имя класса либо интерфейса. Содержит ссылку на Utf8-константу с внутренним именем класса.
  • Fieldref — константа, описывающая определенное поле определенного класса. Содержит ссылку на Class-константу и ссылку на NameAndType-константу.
  • MethodRef, InterfaceMethodRef — константы, описывающие определенный способ класса либо интерфейса. Содержат ссылки на Class-константу и NameAndType-константу.

Для обращения к полю вам необходимо не только его имя, но и полное имя класса, где поле объявлено, а также тип поля. Для обращения к способу вам необходим класс, имя и сигнатура способа. К счастью, каждая сигнатура кодируется в одну строку вне зависимости от числа параметров способа: простые типы кодируются одной буквой (скажем, D = double), объекты — буквой L, за которой следует полное имя класса и точка с запятой, а один ярус массива добавляет квадратную скобку. В скобочках идут типы доводов, а за ними — возвращаемый тип (V — это void). Скажем, сигнатура (IDLjava/lang/Thread;)Ljava/lang/Object; будет у такого способа:

Object m(int i, double d, Thread t) {...}

От того, что для ссылки на способ требуется его точная сигнатура, разработчики изредка напарываются на NoSuchMethodError. Скажем, вы поменяли возвращаемый тип способа на больше определенный. Тогда вызовы этого способа из других классов остаются бывшими, и компилятор не будет пересобирать эти классы, потому что начальные файлы не изменились. Впрочем при попытке вызвать данный способ во время выполнения, Java-машина будет искать ветхую сигнатуру.

Если вы механически генерируете Java-код, помните, что наивысший номер константы в пуле не превышает 65535, позже этого будет оплошность компиляции. Этого не такое огромное число, рассматривая большое число ссылок и то, что long и double занимают по две позиции. Познание устройства пула поможет вам контролировать его заполнение при генерации кода.

Подробнее с устройством пула констант дозволено ознакомиться

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB