Класс 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 |
Упрощает создание оптимизированных методов конкатенации строк, которые можно использовать для эффективной конкатенации известного числа аргументов известных типов, возможно, после адаптации типов и частичного вычисления аргументов. |
Методы, объявленные в классе Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait | Модификатор и тип | Метод | Описание |
|---|---|---|
protected Object |
clone() |
Создает и возвращает копию этого объекта. |
boolean |
equals |
Указывает, равен ли какой-либо другой объект этому объекту. |
protected void |
finalize() |
Устарело, будет удалено: этот элемент API подлежит удалению в будущей версии. Финализация объявлена устаревшей и будет удалена в одном из следующих выпусков. |
final Class |
getClass() |
Возвращает класс времени выполнения этого Object. |
int |
hashCode() |
Возвращает значение хеш-кода этого объекта. |
final void |
notify() |
Пробуждает один поток, ожидающий на мониторе этого объекта. |
final void |
notifyAll() |
Пробуждает все потоки, ожидающие на мониторе этого объекта. |
String |
toString() |
Возвращает строковое представление объекта. |
final void |
wait() |
Заставляет текущий поток ожидать пробуждения, обычно в результате уведомления или прерывания. |
final void |
wait |
Заставляет текущий поток ожидать пробуждения, обычно в результате уведомления или прерывания, либо истечения заданного времени. |
final void |
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. - См. Спецификацию языка 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 и не включает константы. Для цели, принимающей:
- ноль входных данных — результатом конкатенации будет пустая строка;
- одно входное значение — результатом конкатенации будет это значение, преобразованное согласно 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— параметр переменного числа аргументов, представляющий константы, переданные методу связывания. - Возвращает:
- 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.