Класс StringConcatFactory
public final class StringConcatFactory extends Object
Методы для облегчения создания методов конкатенации строк, которые могут быть использованы для эффективной конкатенации известного числа аргументов известных типов, возможно после адаптации типов и частичной оценки аргументов. Эти методы обычно используются в качестве bootstrap-методов для
invokedynamic мест вызова, чтобы поддерживать функцию конкатенации строк языка программирования Java.
Непосредственный доступ к поведению, определённому предоставленным
MethodHandle, происходит в порядке через две фазы:
-
Связывание происходит при вызове методов в этом классе. Они принимают в качестве аргументов тип метода, описывающий количество и типы конкатенируемых аргументов, и необязательно шаблон строки, а также константы, участвующие в конкатенации строк. Подробности о допустимых форматах шаблона описаны ниже. Связывание может включать динамическую загрузку нового класса, реализующего ожидаемое поведение конкатенации.
CallSiteсодержитMethodHandle, указывающий на точный метод конкатенации. Методы конкатенации могут быть общими для разныхCallSite, например, если методы связывания создают их как чистые функции. -
Вызов происходит, когда сгенерированный метод конкатенации вызывается с точными динамическими аргументами. Это может происходить много раз для одного метода конкатенации. Метод, на который ссылается поведение
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 |
Обеспечивает создание оптимизированных методов конкатенации строк, которые могут использоваться для эффективной конкатенации известного числа аргументов известных типов, возможно после адаптации типов и частичной оценки аргументов. |
static CallSite |
makeConcatWithConstants |
Обеспечивает создание оптимизированных методов конкатенации строк, которые могут использоваться для эффективной конкатенации известного числа аргументов известных типов, возможно после адаптации типов и частичной оценки аргументов. |
Подробное описание методов
makeConcat
public static CallSite makeConcat(MethodHandles.Lookup lookup, String name, MethodType concatType) throws StringConcatException
invokedynamic мест вызова, чтобы поддерживать функцию конкатенации строк языка программирования Java. Когда целевой метод, возвращаемый этим методом, вызывается, он возвращает результат конкатенации строк, принимая все аргументы функции, переданные методу связи, в качестве входных данных для конкатенации. Подпись целевого метода задана 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. - См. Спецификацию языка Java:
- 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. Когда целевой метод, возвращаемый этим методом, вызывается, он возвращает результат конкатенации строк, принимая все аргументы функции и константы, переданные методу связи, в качестве входных данных для конкатенации. Подпись целевого метода задана concatType и не включает константы. Для целевого метода, принимающего:
- ноль входных данных, конкатенация приводит к пустой строке;
- один входной параметр, конкатенация приводит к единственному вводу, преобразованному в соответствии с JLS 5.1.11 "Преобразование в строку"; в противном случае
- два или более входных данных, входные данные конкатенируются в соответствии с требованиями, изложенными в JLS 15.18.1 "Оператор конкатенации строк +". Входные данные преобразуются в соответствии с JLS 5.1.11 "Преобразование в строку" и объединяются слева направо.
Рецепт конкатенации — это строковое описание способа построения конкатенированной строки из аргументов и констант. Рецепт обрабатывается слева направо, и каждый символ представляет вход для конкатенации. Символы рецепта означают:
- \1 (Unicode 0001): обычный аргумент. Этот ввод передаётся динамическим аргументом и предоставляется при вызове метода конкатенации. Этот ввод может быть null.
-
\2 (Unicode 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- Аргумент vararg, представляющий константы, переданные методу связи. - Возвращаемое значение:
- CallSite, целевой объект которого может использоваться для выполнения конкатенации строк с динамическими аргументами конкатенации, описанными заданным
concatType. - Исключения:
-
StringConcatException- Если нарушен любой из инвариантов связи, описанных здесь, или контекст поиска не имеет привилегий частного доступа. -
NullPointerException- Если любой из входных аргументов равен null, или любая константа вrecipeравна null. Это никогда не произойдёт при вызове метода-загрузчика с помощью invokedynamic. - См. Спецификацию языка Java:
- 5.1.11 Преобразование в строку
15.18.1 Оператор конкатенации строк +
© 1993, 2025, 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://download.java.net/java/early_access/jdk24/docs/api/java.base/java/lang/invoke/StringConcatFactory.html