Класс StringConcatFactory
public final class StringConcatFactory extends Object
Методы для упрощения создания методов конкатенации строк, которые можно использовать для эффективной конкатенации известного числа аргументов известных типов, возможно, после адаптации типов и частичного вычисления аргументов. Обычно эти методы используются как методы начальной загрузки для точек вызова
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. При вызове цели CallSite, возвращаемой этим методом, она возвращает результат конкатенации строк, используя в качестве входных данных все аргументы функции, переданные методу связывания. Сигнатура цели задается concatType. Для цели, принимающей:
- ноль входных данных — результатом конкатенации будет пустая строка;
- одну входную величину — результатом конкатенации будет единственная входная величина, преобразованная согласно разделу 5.1.11 JLS «Преобразование в строку»; в противном случае
- две или более входных величин — входные величины конкатенируются согласно требованиям, изложенным в разделе 15.18.1 JLS «Оператор конкатенации строк +». Входные величины преобразуются согласно разделу 5.1.11 JLS «Преобразование в строку» и объединяются слева направо.
Предположим, что аргументы связывания имеют следующий вид:
-
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. При вызове цели CallSite, возвращаемой этим методом, она возвращает результат конкатенации строк, используя в качестве входных данных все аргументы функции и константы, переданные методу связывания. Сигнатура цели задается concatType и не включает константы. Для цели, принимающей:
- ноль входных данных — результатом конкатенации будет пустая строка;
- одну входную величину — результатом конкатенации будет единственная входная величина, преобразованная согласно разделу 5.1.11 JLS «Преобразование в строку»; в противном случае
- две или более входных величин — входные величины конкатенируются согласно требованиям, изложенным в разделе 15.18.1 JLS «Оператор конкатенации строк +». Входные величины преобразуются согласно разделу 5.1.11 JLS «Преобразование в строку» и объединяются слева направо.
Рецепт конкатенации — это строковое описание способа создания результирующей строки из аргументов и констант. Рецепт обрабатывается слева направо, каждый символ представляет собой входную величину для конкатенации. Символы рецепта имеют следующее значение:
- \1 (кодовая точка Unicode 0001): обычный аргумент. Эта входная величина передается как динамический аргумент и предоставляется при вызове метода конкатенации. Эта входная величина может быть null.
-
\2 (кодовая точка Unicode 0002): константа. Эта входная величина передается как статический аргумент начальной загрузки. Константой может быть любое значение, представимое в пуле констант. При необходимости фабрика вызовет
toStringдля однократного преобразования в строку. - Любое другое значение char: символьная константа.
Предположим, что аргументы связывания имеют следующий вид:
-
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. - См. Спецификацию языка 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://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/invoke/StringConcatFactory.html