Класс StringConcatFactory

public final class StringConcatFactory
extends Object

Методы для облегчения создания методов конкатенации строк, которые могут быть использованы для эффективной конкатенации известного количества аргументов известных типов, возможно после адаптации типов и частичного вычисления аргументов. Эти методы обычно используются в качестве методов-загрузчиков для 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:

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

С:
9

Методы

Модификатор и тип Метод Описание
static CallSite makeConcat​(MethodHandles.Lookup lookup, String name, MethodType concatType)

Обеспечивает создание оптимизированных методов конкатенации строк, которые могут быть использованы для эффективной конкатенации известного количества аргументов известных типов, возможно, после адаптации типов и частичного вычисления аргументов.

static CallSite makeConcatWithConstants​(MethodHandles.Lookup lookup, String name, MethodType concatType, String recipe, Object... constants)

Обеспечивает создание оптимизированных методов конкатенации строк, которые могут быть использованы для эффективной конкатенации известного количества аргументов известных типов, возможно, после адаптации типов и частичного вычисления аргументов.

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

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

Методы

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
Параметры:
lookup - Представляет контекст поиска с привилегиями доступа вызывающего объекта. В частности, контекст поиска должен иметь привилегии частного доступа. При использовании с invokedynamic, это автоматически добавляется в стек виртуальной машиной.
name - Название метода для реализации. Это имя произвольное и не имеет значения для этого метода связи. При использовании с invokedynamic, это предоставляется NameAndType структуры InvokeDynamic и автоматически добавляется в стек виртуальной машиной.
concatType - Ожидаемая подпись CallSite. Типы параметров представляют типы аргументов конкатенации; тип возвращаемого значения всегда присваивается из String. При использовании с invokedynamic, это предоставляется NameAndType структуры InvokeDynamic и автоматически добавляется в стек виртуальной машиной.
Возвращаемое значение:
CallSite, чья цель может быть использована для выполнения конкатенации строк с динамическими аргументами конкатенации, описанными заданным concatType.
Исключения:
StringConcatException - Если нарушены какие-либо инварианты связи, описанные здесь, или контекст поиска не имеет привилегий частного доступа.
NullPointerException - Если любой из входных аргументов равен null. Это никогда не произойдёт, когда метод-загрузчик вызывается с invokedynamic.

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:
Генераторы кода имеют три разных способа обработки операнда константы строки S в выражении конкатенации строк. Во-первых, S может быть материализован как ссылка (с помощью ldc) и передан как обычный аргумент (рецепт '\1'). Или S может быть сохранён в пуле констант и передан как константа (рецепт '\2'). Наконец, если S не содержит ни одного из символов рецепта ('\1', '\2'), то S может быть встроен непосредственно в сам рецепт, вызывая вставку его символов в результат.
Параметры:
lookup - Представляет контекст поиска с привилегиями доступа вызывающего объекта. В частности, контекст поиска должен иметь привилегии частного доступа. При использовании с invokedynamic, это автоматически добавляется в стек виртуальной машиной.
name - Название метода для реализации. Это имя произвольное и не имеет значения для этого метода связи. При использовании с invokedynamic, это предоставляется NameAndType структуры InvokeDynamic и автоматически добавляется в стек виртуальной машиной.
concatType - Ожидаемая подпись CallSite. Типы параметров представляют типы динамических аргументов конкатенации; тип возвращаемого значения всегда присваивается из String. При использовании с invokedynamic, это предоставляется NameAndType структуры InvokeDynamic и автоматически добавляется в стек виртуальной машиной.
recipe - Рецепт конкатенации, описанный выше.
constants - Аргумент переменной длины, представляющий константы, переданные методу связи.
Возвращаемое значение:
CallSite, чья цель может быть использована для выполнения конкатенации строк с динамическими аргументами конкатенации, описанными заданным concatType.
Исключения:
StringConcatException - Если нарушены какие-либо инварианты связи, описанные здесь, или контекст поиска не имеет привилегий частного доступа.
NullPointerException - Если любой из входных аргументов равен null, или любая константа в recipe равна null. Это никогда не произойдёт, когда метод-загрузчик вызывается с invokedynamic.

© 1993, 2020, 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/11/docs/api/java.base/java/lang/invoke/StringConcatFactory.html

Spec-Zone .ru
спецификации, руководства, описания, API