Класс DynamicLinkerFactory
java.lang.Object
jdk.dynalink.DynamicLinkerFactory
public final class DynamicLinkerFactory extends Object
Класс фабрики для создания объектов
DynamicLinker. Динамические линкеры — центральные объекты Dynalink; они состоят из нескольких объектов GuardingDynamicLinker и координируют связывание точек вызова с ними. Обычно динамический линкер состоит из всех объектов GuardingDynamicLinker, явно предварительно созданных пользователем фабрики и настроенных с помощью setPrioritizedLinkers(List), а также любых объектов, настроенных с помощью automatically discovered, и, наконец, объектов, настроенных с помощью setFallbackLinkers(List); в последнюю категорию обычно входит BeansLinker.- Начиная с:
- 9
Краткое описание конструкторов
| Конструктор | Описание |
|---|---|
DynamicLinkerFactory() |
Создает фабрику динамических линкеров с конфигурацией по умолчанию. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
DynamicLinker |
createLinker() |
Создает новый динамический линкер на основе текущей конфигурации. |
List |
getAutoLoadingErrors() |
Возвращает список объектов ServiceConfigurationError, обнаруженных при загрузке автоматически найденных линкеров во время последнего вызова createLinker(). |
void |
setAutoConversionStrategy |
Задает объект, представляющий стратегию преобразования для автоматического преобразования типов. |
void |
setClassLoader |
Задает загрузчик классов для автоматического поиска доступных защищающих динамических линкеров. |
void |
setFallbackLinkers |
Задает резервные защищающие динамические линкеры. |
void |
setFallbackLinkers |
Задает резервные защищающие динамические линкеры. |
void |
setInternalObjectsFilter |
Задает преобразователь дескрипторов методов, предназначенный для реализации LinkerServices.filterInternalObjects(MethodHandle) для служб линкеров динамических линкеров, созданных этой фабрикой. |
void |
setPrelinkTransformer |
Задает преобразователь перед связыванием. |
void |
setPrioritizedLinker |
Задает один приоритетный линкер. |
void |
setPrioritizedLinkers |
Задает приоритетные защищающие динамические линкеры. |
void |
setPrioritizedLinkers |
Задает приоритетные защищающие динамические линкеры. |
void |
setSyncOnRelink |
Задает, будет ли созданный этой фабрикой динамический линкер вызывать MutableCallSite.syncAll(MutableCallSite[]) после повторного связывания точки вызова. |
void |
setUnstableRelinkThreshold |
Задает порог нестабильного повторного связывания — количество повторных связываний точки вызова, после которого она будет считаться нестабильной и последующие запросы на ее связывание будут указывать на это. |
Подробное описание конструкторов
DynamicLinkerFactory
public DynamicLinkerFactory()
Создает фабрику динамических линкеров с конфигурацией по умолчанию. После создания фабрику можно настроить с помощью различных методов
setXxx() и использовать для создания одного или нескольких динамических линкеров в соответствии с ее текущей конфигурацией с помощью createLinker().Подробное описание методов
setClassLoader
public void setClassLoader(ClassLoader classLoader)
Задает загрузчик классов для автоматического поиска доступных защищающих динамических линкеров. Реализации
GuardingDynamicLinkerExporter, доступные через этот загрузчик классов, будут автоматически созданы с помощью механизма ServiceLoader, а предоставляемые ими линкеры будут включены в создаваемые этой фабрикой DynamicLinkers. Это позволяет обеспечить взаимодействие между языками: точки вызова, принадлежащие среде выполнения этого языка, могут связываться линкерами из автоматически обнаруженных сред выполнения, если их собственные объекты передаются в эту среду выполнения. Если загрузчик классов явно не задан вызовом этого метода, будет использоваться загрузчик классов контекста потока, вызывающего createLinker(). Если этот метод явно вызван со значением null, для загрузки линкеров будет использоваться ServiceLoader.loadInstalled(Class).- Параметры:
-
classLoader— загрузчик классов, используемый для автоматического поиска доступных линкеров.
setPrioritizedLinkers
public void setPrioritizedLinkers(List<? extends GuardingDynamicLinker> prioritizedLinkers)
Задает приоритетные защищающие динамические линкеры. В средах выполнения языков, использующих Dynalink, обычно есть как минимум один линкер для собственного языка. При связывании точек вызова результирующий динамический линкер будет обращаться к этим линкерам в первую очередь, до любых автоматически обнаруженных и резервных линкеров. Если фабрика также автоматически обнаружит класс линкера, соответствующий одному из приоритетных линкеров, автоматически обнаруженный класс будет проигнорирован, а вместо него будет использоваться явно заданный приоритетный экземпляр.
- Параметры:
-
prioritizedLinkers— список приоритетных линкеров. Может быть null. - Исключения:
-
NullPointerException— если какой-либо элемент списка равен null.
setPrioritizedLinkers
public void setPrioritizedLinkers(GuardingDynamicLinker... prioritizedLinkers)
Задает приоритетные защищающие динамические линкеры. То же, что вызов
setPrioritizedLinkers(List) с аргументом Arrays.asList(prioritizedLinkers).- Параметры:
-
prioritizedLinkers— массив приоритетных линкеров. Может быть null. - Исключения:
-
NullPointerException— если какой-либо элемент массива равен null.
setPrioritizedLinker
public void setPrioritizedLinker(GuardingDynamicLinker prioritizedLinker)
Задает один приоритетный линкер. То же, что вызов
setPrioritizedLinkers(List) со списком из одного элемента.- Параметры:
-
prioritizedLinker— единственный приоритетный линкер. Не должен быть null. - Исключения:
-
NullPointerException— если передано значение null.
setFallbackLinkers
public void setFallbackLinkers(List<? extends GuardingDynamicLinker> fallbackLinkers)
Задает резервные защищающие динамические линкеры. При связывании точек вызова результирующий динамический линкер будет обращаться к этим линкерам в последнюю очередь, после любых автоматически обнаруженных и приоритетных линкеров. Если фабрика также автоматически обнаружит класс линкера, соответствующий одному из резервных линкеров, автоматически обнаруженный класс будет проигнорирован, а вместо него будет использоваться явно заданный резервный экземпляр.
- Параметры:
-
fallbackLinkers— список резервных линкеров. Может быть пустым, если вызывающий код не хочет задавать резервные линкеры. Обратите внимание: если этот метод не вызывается явно или ему передается null, фабрика создаст экземплярBeansLinker, который будет использоваться в качестве резервного линкера по умолчанию. - Исключения:
-
NullPointerException— если какой-либо элемент списка равен null.
setFallbackLinkers
public void setFallbackLinkers(GuardingDynamicLinker... fallbackLinkers)
Задает резервные защищающие динамические линкеры. То же, что вызов
setFallbackLinkers(List) с аргументом Arrays.asList(fallbackLinkers).- Параметры:
-
fallbackLinkers— массив резервных линкеров. Может быть пустым, если вызывающий код не хочет задавать резервные линкеры. Обратите внимание: если этот метод не вызывается явно или ему передается null, фабрика создаст экземплярBeansLinker, который будет использоваться в качестве резервного линкера по умолчанию. - Исключения:
-
NullPointerException— если какой-либо элемент массива равен null.
setSyncOnRelink
public void setSyncOnRelink(boolean syncOnRelink)
Задает, будет ли созданный этой фабрикой динамический линкер вызывать
MutableCallSite.syncAll(MutableCallSite[]) после повторного связывания точки вызова. По умолчанию используется значение false. Вероятно, следует задать значение true, если среда выполнения поддерживает многопоточное выполнение динамически связанного кода.- Параметры:
-
syncOnRelink— true для вызова sync при повторном связывании, иначе false.
setUnstableRelinkThreshold
public void setUnstableRelinkThreshold(int unstableRelinkThreshold)
Задает порог нестабильного повторного связывания — количество повторных связываний точки вызова, после которого она будет считаться нестабильной и последующие запросы на ее связывание будут указывать на это. Если значение не задано явно, по умолчанию используется 8.
- Параметры:
-
unstableRelinkThreshold— новое пороговое значение. Не должно быть меньше нуля. Значение 0 означает, что точки вызова никогда не будут считаться нестабильными. - См. также:
setPrelinkTransformer
public void setPrelinkTransformer(GuardedInvocationTransformer prelinkTransformer)
Задает преобразователь перед связыванием. Это объект
GuardedInvocationTransformer, которому предоставляется последняя возможность изменить защищенный вызов после его создания компонентным линкером и до того, как динамический линкер свяжет его с точкой вызова. Обычно он используется для приведения типа возвращаемого значения вызова к типу точки вызова. Если преобразователь не задан явно, будет использоваться преобразователь перед связыванием по умолчанию, который просто вызывает GuardedInvocation.asType(LinkerServices, MethodType). Пользовательские преобразователи перед связыванием требуются редко; в основном они используются как строительный блок для реализации продвинутых методов, например стратегий деоптимизации кода.- Параметры:
-
prelinkTransformer— преобразователь перед связыванием для динамического линкера. Может быть null, чтобы фабрика использовала преобразователь по умолчанию.
setAutoConversionStrategy
public void setAutoConversionStrategy(MethodTypeConversionStrategy autoConversionStrategy)
Задает объект, представляющий стратегию преобразования для автоматического преобразования типов. После того как
LinkerServices.asType(MethodHandle, MethodType) применит все пользовательские преобразования к дескриптору метода, ему все еще необходимо выполнить method
invocation conversions, которые обычно можно применить автоматически в соответствии с MethodHandle.asType(MethodType). Однако иногда среды выполнения языков хотят настраивать и эти преобразования для собственных точек вызова. Типичный пример — разрешение распаковки null-значений, возвращаемых из методов, что по умолчанию запрещено обычным MethodHandles.asType(). В этом случае среда выполнения языка может установить собственную стратегию автоматического преобразования, способную обрабатывать null-значения. Обратите внимание: при вызове MethodTypeConversionStrategy.asType(MethodHandle, MethodType) стратегии пользовательские языковые преобразования уже будут применены к дескриптору метода, поэтому по замыслу разница между текущим типом метода дескриптора и желаемым конечным типом будет состоять только из преобразований, допустимых при вызове метода. Стратегии также не нужно вызывать финальный MethodHandle.asType(), поскольку он будет выполнен внутри как последний шаг.- Параметры:
-
autoConversionStrategy— стратегия применения преобразований при вызове метода для линкера, созданного этой фабрикой. Может быть null, если пользовательская стратегия не нужна.
setInternalObjectsFilter
public void setInternalObjectsFilter(MethodHandleTransformer internalObjectsFilter)
Задает преобразователь дескрипторов методов, который должен реализовывать
LinkerServices.filterInternalObjects(MethodHandle) для служб линкеров динамических линкеров, созданных этой фабрикой. Некоторые среды выполнения языков могут иметь внутренние объекты, которые не должны покидать пределы их области видимости. Здесь можно добавить преобразователь, изменяющий дескриптор метода так, чтобы к параметрам, способным получать потенциально внутренние объекты среды выполнения языка, применялся фильтр, предотвращающий их утечку, например путем оборачивания этих объектов. Преобразователь также может добавить фильтр для распаковки возвращаемого значения. Для упрощенного создания таких фильтрующих преобразователей предоставлен вспомогательный класс DefaultInternalObjectFilter.- Параметры:
-
internalObjectsFilter— преобразователь дескрипторов методов, фильтрующий внутренние объекты, или null.
createLinker
public DynamicLinker createLinker()
Создает новый динамический линкер на основе текущей конфигурации. Этот метод можно вызывать несколько раз для создания нескольких динамических линкеров. Автоматически обнаруженные линкеры создаются заново при каждом вызове этого метода. Между вызовами конфигурацию фабрики разрешается изменять. Метод не является потокобезопасным. После вызова вызывающий код может вызвать
getAutoLoadingErrors(), чтобы получить список объектов ServiceConfigurationError, возникших при попытке загрузить автоматически обнаруженные линкеры. Они никогда не выбрасываются при вызове этого метода, поскольку он старается обработать их и игнорировать линкеры, загрузка которых завершилась с ошибкой.- Возвращает:
- новый динамический линкер
getAutoLoadingErrors
public List<ServiceConfigurationError> getAutoLoadingErrors()
Возвращает список объектов
ServiceConfigurationError, обнаруженных при загрузке автоматически найденных линкеров во время последнего вызова createLinker(). Это могут быть любые проблемы конфигурации служб, не связанные непосредственно с Dynalink, а также некоторые специфичные для Dynalink ошибки, возникающие, если экспортер, который фабрика пыталась загрузить автоматически: - вернул null из
Supplier.get()или - список, возвращенный из
Supplier.get(), содержал элемент null.
- Возвращает:
- неизменяемый список обнаруженных объектов
ServiceConfigurationError. Может быть пустым.
© 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/jdk.dynalink/jdk/dynalink/DynamicLinkerFactory.html