Spec-Zone.ru › OpenJDK 21

Класс StringConcatFactory

java.lang.Object
java.lang.invoke.StringConcatFactory
public final class StringConcatFactory extends Object

Методы для облегчения создания методов конкатенации строк, которые могут быть использованы для эффективной конкатенации известного числа аргументов известных типов, возможно, после адаптации типов и частичной оценки аргументов. Эти методы обычно используются в качестве bootstrap-методов для invokedynamic мест вызова, чтобы поддержать функцию конкатенации строк языка программирования Java.

Непрямой доступ к поведению, определённому предоставленным MethodHandle происходит в порядке через две фазы:

  1. Связывание происходит при вызове методов в этом классе. Они принимают в качестве аргументов тип метода, описывающий количество и типы конкатенированных аргументов, и, необязательно, шаблон строки, плюс константы, участвующие в конкатенации строк. Подробности о допустимых формах шаблонов описаны ниже. Связывание может включать динамическую загрузку нового класса, реализующего ожидаемое поведение конкатенации. CallSite содержит MethodHandle, указывающий на точный метод конкатенации. Методы конкатенации могут быть совместно использованы между различными CallSite , например, если методы связывания производят их как чистые функции.
  2. Вызов происходит при вызове сгенерированного метода конкатенации с точными динамическими аргументами. Это может происходить много раз для одного метода конкатенации. Метод, на который указывает поведение MethodHandle вызывается со статическими аргументами и любыми дополнительными динамическими аргументами, предоставленными при вызове, как если бы это делалось с помощью MethodHandle.invoke(Object...).

Этот класс предоставляет два вида методов связывания: простую версию (makeConcat(java.lang.invoke.MethodHandles.Lookup, String, MethodType)) использующую только динамические аргументы, и расширенную версию (makeConcatWithConstants(java.lang.invoke.MethodHandles.Lookup, String, MethodType, String, Object...)) использующую расширенные формы захвата константных аргументов. Расширенная стратегия может создавать незначительно лучший байт-код вызова, за счет взрыва количества форм методов конкатенации строк, присутствующих во время выполнения, поскольку эти формы будут включать статические константные аргументы также.

API Note:

Существует ограничение JVM (ограничение структуры файла класса): ни один метод не может вызывать с более чем 255 слотами. Это ограничивает количество статических и динамических аргументов, которые можно передать методу-оболочке. Поскольку есть потенциальные стратегии конкатенации, использующие MethodHandle комбинаторы, нам необходимо зарезервировать несколько пустых слотов в списках параметров для захвата временных результатов. Вот почему методы-оболочки в этом фабричном классе не принимают более 200 слотов аргументов. Пользователи, которым требуется более 200 слотов аргументов в конкатенации, должны разделить большую конкатенацию на более мелкие выражения.

Since:
9

Краткое описание полей

Модификатор и тип Поле Описание
static final int MAX_INDY_CONCAT_ARG_SLOTS
Предварительный просмотр.
Максимальное количество слотов аргументов в вызове String Concat.

Краткое описание методов

Модификатор и тип Метод Описание
static CallSite makeConcat(MethodHandles.Lookup lookup, String name, MethodType concatType)
Обеспечивает создание оптимизированных методов конкатенации строк, которые могут быть использованы для эффективной конкатенации известного числа аргументов известных типов, возможно, после адаптации типов и частичной оценки аргументов.
static CallSite makeConcatWithConstants(MethodHandles.Lookup lookup, String name, MethodType concatType, String recipe, Object... constants)
Обеспечивает создание оптимизированных методов конкатенации строк, которые могут быть использованы для эффективной конкатенации известного числа аргументов известных типов, возможно, после адаптации типов и частичной оценки аргументов.
static MethodHandle makeConcatWithTemplate(List<String> fragments, List<Class<?>> ptypes)
Предварительный просмотр.
Упрощенный метод конкатенации для облегчения конкатенации StringTemplateПРЕДПРОСМОТР.
static List<MethodHandle> makeConcatWithTemplateCluster(List<String> fragments, List<Class<?>> ptypes, int maxSlots)
Предварительный просмотр.
Этот метод разбивает большие конкатенации на отдельные MethodHandles на основе количества слотов, необходимых для каждого MethodHandle.
static MethodHandle makeConcatWithTemplateGetters(List<String> fragments, List<MethodHandle> getters, int maxSlots)
Предварительный просмотр.
Этот метод создаёт MethodHandle, ожидающий один вход — получатель предоставленных методов доступа.

Методы, унаследованные от класса java.lang.Object

clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

Подробное описание полей

MAX_INDY_CONCAT_ARG_SLOTS

public static final int MAX_INDY_CONCAT_ARG_SLOTS
MAX_INDY_CONCAT_ARG_SLOTS — это предварительный API платформы Java.
Программы могут использовать MAX_INDY_CONCAT_ARG_SLOTS только при включенных предварительных функциях.
Предварительные функции могут быть удалены в будущих выпусках или обновлены до постоянных функций платформы Java.
Максимальное количество слотов аргументов в вызове String Concat. Хотя максимальное количество слотов аргументов, которые может обработать вызов indy, равно 253, мы не используем все эти слоты, чтобы позволить стратегиям с комбинаторами MethodHandle использовать некоторые аргументы.
Since:
21

Подробное описание методов

makeConcat

public static CallSite makeConcat(MethodHandles.Lookup lookup, String name, MethodType concatType) throws StringConcatException
Обеспечивает создание оптимизированных методов конкатенации строк, которые могут использоваться для эффективной конкатенации известного числа аргументов известных типов, возможно, после адаптации типов и частичной оценки аргументов. Обычно используется как метод-оболочка для invokedynamic мест вызова, чтобы поддерживать функцию конкатенации строк языка программирования Java.

При вызове целевого метода CallSite, возвращаемого этим методом, он возвращает результат конкатенации строк, принимая все аргументы функции, переданные методу связи, в качестве входных данных для конкатенации. Подпись целевого метода задается concatType. Для целевого метода, принимающего:

  • ноль входных данных, конкатенация приводит к пустой строке;
  • один входной параметр, конкатенация приводит к единственному входному значению, преобразованному в соответствии с JLS 5.1.11 «Преобразование строки»; в противном случае
  • два или более входных данных, входные данные конкатенируются в соответствии с требованиями, изложенными в JLS 15.18.1 «Оператор конкатенации строк +». Входные данные преобразуются в соответствии с JLS 5.1.11 «Преобразование строки» и объединяются слева направо.

Предположим, что аргументы связи следующие:

  • concatType, описывающий подпись CallSite

Тогда должны выполняться следующие инварианты связи:

  • Количество слотов параметров в concatType меньше или равно 200
  • Тип возвращаемого значения в concatType присваивается из String
Parameters:
lookup - Представляет контекст поиска с привилегиями доступа вызывающего метода. В частности, контекст поиска должен иметь полный доступ к привилегиям. При использовании с invokedynamic, это автоматически стекируется виртуальной машиной.
name - Имя метода для реализации. Это имя произвольное и не имеет смысла для этого метода связи. При использовании с invokedynamic, это предоставляется NameAndType структуры InvokeDynamic и автоматически стекируется виртуальной машиной.
concatType - Ожидаемая подпись CallSite. Типы параметров представляют типы аргументов конкатенации; тип возвращаемого значения всегда присваивается из String. При использовании с invokedynamic, это предоставляется NameAndType структуры InvokeDynamic и автоматически стекируется виртуальной машиной.
Returns:
CallSite, чья цель может быть использована для выполнения конкатенации строк с динамическими аргументами конкатенации, описанными заданной concatType.
Throws:
StringConcatException - Если какой-либо из инвариантов связи, описанных здесь, нарушен или у контекста поиска нет привилегий частного доступа.
NullPointerException - Если какой-либо из входных аргументов равен null. Это никогда не произойдет при вызове метода-оболочки с invokedynamic.
See Java Language Specification:
5.1.11 Преобразование строки
15.18.1 Оператор конкатенации строк +

makeConcatWithConstants

public static CallSite makeConcatWithConstants(MethodHandles.Lookup lookup, String name, MethodType concatType, String recipe, Object... constants) throws StringConcatException
Обеспечивает создание оптимизированных методов конкатенации строк, которые могут использоваться для эффективной конкатенации известного числа аргументов известных типов, возможно, после адаптации типов и частичной оценки аргументов. Обычно используется как метод-оболочка для invokedynamic мест вызова, чтобы поддерживать функцию конкатенации строк языка программирования Java.

При вызове целевого метода CallSite, возвращаемого этим методом, он возвращает результат конкатенации строк, принимая все аргументы функции и константы, переданные методу связи, в качестве входных данных для конкатенации. Подпись целевого метода задается concatType, и не включает константы. Для целевого метода, принимающего:

  • ноль входных данных, конкатенация приводит к пустой строке;
  • один входной параметр, конкатенация приводит к единственному входному значению, преобразованному в соответствии с JLS 5.1.11 «Преобразование строки»; в противном случае
  • два или более входных данных, входные данные конкатенируются в соответствии с требованиями, изложенными в JLS 15.18.1 «Оператор конкатенации строк +». Входные данные преобразуются в соответствии с JLS 5.1.11 «Преобразование строки» и объединяются слева направо.

Рецепт конкатенации — это строковое описание способа построения конкатенированной строки из аргументов и констант. Рецепт обрабатывается слева направо, и каждый символ представляет вход для конкатенации. Символы рецепта означают:

  • \1 (Unicode point 0001): обычный аргумент. Этот вход передается через динамический аргумент и предоставляется при вызове метода конкатенации. Этот вход может быть null.
  • \2 (Unicode point 0002): константа. Этот вход передается через статический аргумент оболочки. Эта константа может быть любым значением, представимым в пуле констант. При необходимости фабрика вызовет toString для выполнения одноразового преобразования строки.
  • Любое другое значение символа: константа-символ.

Предположим, что аргументы связи следующие:

  • concatType, описывающий подпись CallSite
  • recipe, описывающий строковый рецепт
  • constants, массив аргументов-констант

Тогда должны выполняться следующие инварианты связи:

  • Количество слотов параметров в concatType меньше или равно 200
  • Количество параметров в concatType равно количеству тегов \1 в recipe
  • Тип возвращаемого значения в concatType присваивается из String, и соответствует типу возвращаемого значения MethodHandle
  • Количество элементов в constants равно количеству тегов \2 в recipe
API Note:
Генераторы кода имеют три различных способа обработки операнда S — строковой константы — в выражении конкатенации строк. Во-первых, S может быть материализован как ссылка (с помощью ldc) и передан как обычный аргумент (рецепт '\1'). Во-вторых, S может быть сохранен в пуле констант и передан как константа (рецепт '\2'). Наконец, если S не содержит ни одного из символов рецепта ('\1', '\2'), то S может быть встроен непосредственно в сам рецепт, что приведет к вставке его символов в результат.
Parameters:
lookup - Представляет контекст поиска с привилегиями доступа вызывающего метода. В частности, контекст поиска должен иметь полный доступ к привилегиям. При использовании с invokedynamic, это автоматически стекируется виртуальной машиной.
name - Имя метода для реализации. Это имя произвольное и не имеет смысла для этого метода связи. При использовании с invokedynamic, это предоставляется NameAndType структуры InvokeDynamic и автоматически стекируется виртуальной машиной.
concatType - Ожидаемая подпись CallSite. Типы параметров представляют типы динамических аргументов конкатенации; тип возвращаемого значения всегда присваивается из String. При использовании с invokedynamic, это предоставляется NameAndType структуры InvokeDynamic и автоматически стекируется виртуальной машиной.
recipe - Рецепт конкатенации, описанный выше.
constants - Аргумент vararg, представляющий константы, переданные методу связи.
Returns:
CallSite, чья цель может быть использована для выполнения конкатенации строк с динамическими аргументами конкатенации, описанными заданной concatType.
Throws:
StringConcatException - Если какой-либо из инвариантов связи, описанных здесь, нарушен или у контекста поиска нет привилегий частного доступа.
NullPointerException - Если какой-либо из входных аргументов равен null или любая константа в recipe равна null. Это никогда не произойдет при вызове метода-оболочки с invokedynamic.
See Java Language Specification:
5.1.11 Преобразование строки
15.18.1 Оператор конкатенации строк +

Метод makeConcatWithTemplate

public static MethodHandle makeConcatWithTemplate(List<String> fragments, List<Class<?>> ptypes) throws StringConcatException
makeConcatWithTemplate — это предварительный API платформы Java.
Программы могут использовать makeConcatWithTemplate только при включенных предварительных функциях.
Предварительные функции могут быть удалены в будущих выпусках или обновлены до постоянных функций платформы Java.
Упрощенный метод конкатенации для облегчения конкатенации StringTemplateПРЕДПРОСМОТР. Этот метод возвращает один метод конкатенации, который чередует фрагменты и значения. fragment|value|fragment|value|...|value|fragment. Количество фрагментов должно быть на один больше, чем количество типов ptypes. Общее количество слотов, используемых типами ptypes, должно быть меньше или равно MAX_INDY_CONCAT_ARG_SLOTSПРЕДПРОСМОТР.
Параметры:
fragments - список строковых фрагментов
ptypes - список типов выражений
Возвращает:
метод MethodHandle для конкатенации
Исключение:
StringConcatException - Если нарушены какие-либо из инвариантов связывания.
NullPointerException - Если какой-либо из входных аргументов равен null.
IllegalArgumentException - Если количество слотов значений превышает MAX_INDY_CONCAT_ARG_SLOTSПРЕДПРОСМОТР.
Начиная с:
21

Метод makeConcatWithTemplateCluster

public static List<MethodHandle> makeConcatWithTemplateCluster(List<String> fragments, List<Class<?>> ptypes, int maxSlots) throws StringConcatException
makeConcatWithTemplateCluster — это предварительный API платформы Java.
Программы могут использовать makeConcatWithTemplateCluster только при включенных предварительных функциях.
Предварительные функции могут быть удалены в будущих выпусках или обновлены до постоянных функций платформы Java.
Этот метод разбивает большие конкатенации на отдельные MethodHandles на основе количества слотов, требуемых каждым MethodHandle. Каждый MethodHandle после первого будет иметь дополнительный слот String для результата от предыдущего MethodHandle. makeConcatWithTemplate(java.util.List<java.lang.String>, java.util.List<java.lang.Class<?>>)ПРЕДПРОСМОТР используется для построения MethodHandles. Общее количество слотов, используемых типами ptypes, не ограничено. Однако необходимо учитывать сочетание MethodHandles, чтобы их суммарное количество не превысило 255 слотов.
Параметры:
fragments - список строковых фрагментов
ptypes - список типов выражений
maxSlots - максимальное количество слотов на MethodHandle.
Возвращает:
Список MethodHandles
Исключение:
IllegalArgumentException - Если maxSlots не находится в диапазоне от 1 до MAX_INDY_CONCAT_ARG_SLOTS.
StringConcatException - Если нарушены какие-либо из инвариантов связывания.
NullPointerException - Если какой-либо из входных аргументов равен null.
IllegalArgumentException - Если количество слотов значений превышает MAX_INDY_CONCAT_ARG_SLOTSПРЕДПРОСМОТР.
Начиная с:
21

Метод makeConcatWithTemplateGetters

public static MethodHandle makeConcatWithTemplateGetters(List<String> fragments, List<MethodHandle> getters, int maxSlots) throws StringConcatException
makeConcatWithTemplateGetters — это предварительный API платформы Java.
Программы могут использовать makeConcatWithTemplateGetters только при включенных предварительных функциях.
Предварительные функции могут быть удалены в будущих выпусках или обновлены до постоянных функций платформы Java.
Этот метод создает MethodHandle, ожидающий один вход — получатель предоставленных методов получения. Этот метод использует makeConcatWithTemplateCluster(java.util.List<java.lang.String>, java.util.List<java.lang.Class<?>>, int)ПРЕДПРОСМОТР для создания промежуточного MethodHandles.
Параметры:
fragments - список строковых фрагментов
getters - список методов получения MethodHandles
maxSlots - максимальное количество слотов на MethodHandle в кластере.
Возвращает:
метод MethodHandle для конкатенации
Исключение:
IllegalArgumentException - Если maxSlots не находится в диапазоне от 1 до MAX_INDY_CONCAT_ARG_SLOTS или методы получения не используют один и тот же тип аргумента.
StringConcatException - Если нарушены какие-либо из инвариантов связывания.
NullPointerException - Если какой-либо из входных аргументов равен null.
IllegalArgumentException - Если количество слотов значений превышает MAX_INDY_CONCAT_ARG_SLOTSПРЕДПРОСМОТР.
Начиная с:
21

© 1993, 2023, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/invoke/StringConcatFactory.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API