Класс DynamicLinkerFactory
- java.lang.Object
-
- jdk.dynalink.DynamicLinkerFactory
public final class DynamicLinkerFactory extends Object
Класс-фабрика для создания объектов DynamicLinker. Динамические линкеры — это центральные объекты в Dynalink; они состоят из нескольких объектов GuardingDynamicLinker и координируют связывание вызовов с ними. Обычно динамический линкер — это линкер, составленный из всех объектов GuardingDynamicLinker, явно предварительно созданных пользователем фабрики и сконфигурированных с помощью setPrioritizedLinkers(List), а также любых объектов automatically discovered, и, наконец, объектов, сконфигурированных с помощью setFallbackLinkers(List); последняя категория обычно включает BeansLinker.
Конструкторы
| Конструктор | Описание |
|---|---|
DynamicLinkerFactory() | Создаёт новый фабрику динамических линковров с настройками по умолчанию. |
Методы
| Модификатор и тип | Метод | Описание |
|---|---|---|
DynamicLinker | createLinker() | Создаёт новый динамический линкер на основе текущей конфигурации. |
List<ServiceConfigurationError> | getAutoLoadingErrors() | Возвращает список |
void | setAutoConversionStrategy(MethodTypeConversionStrategy autoConversionStrategy) | Устанавливает объект, представляющий стратегию преобразования для автоматического преобразования типов. |
void | setClassLoader(ClassLoader classLoader) | Устанавливает загрузчик классов для автоматического обнаружения доступных динамических линковров. |
void | setFallbackLinkers(List<? extends GuardingDynamicLinker> fallbackLinkers) | Устанавливает резервные динамические линковры. |
void | setFallbackLinkers(GuardingDynamicLinker... fallbackLinkers) | Устанавливает резервные динамические линковры. |
void | setInternalObjectsFilter(MethodHandleTransformer internalObjectsFilter) | Устанавливает трансформатор обработчика методов, который должен действовать как реализация |
void | setPrelinkTransformer(GuardedInvocationTransformer prelinkTransformer) | Устанавливает трансформатор предварительного связывания. |
void | setPrioritizedLinker(GuardingDynamicLinker prioritizedLinker) | Устанавливает единственный приоритетный линкер. |
void | setPrioritizedLinkers(List<? extends GuardingDynamicLinker> prioritizedLinkers) | Устанавливает приоритетные динамические линковры. |
void | setPrioritizedLinkers(GuardingDynamicLinker... prioritizedLinkers) | Устанавливает приоритетные динамические линковры. |
void | setSyncOnRelink(boolean syncOnRelink) | Устанавливает, будет ли динамический линкер, созданный этой фабрикой, вызывать |
void | setUnstableRelinkThreshold(int unstableRelinkThreshold) | Устанавливает порог нестабильности пересвязывания; количество раз, когда место вызова пересвязывается после которого оно считается нестабильным, и последующие запросы на связывание для него будут указывать на это. |
Методы, унаследованные от класса java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait Конструкторы
DynamicLinkerFactory
public DynamicLinkerFactory()
Создаёт новый фабрику динамического линкера с конфигурацией по умолчанию. После создания фабрику можно настроить с помощью различных setXxx() методов и использовать для создания одного или нескольких динамических линкеров в соответствии с её текущей конфигурацией, используя createLinker().
Методы
setClassLoader
public void setClassLoader(ClassLoader classLoader)
Устанавливает загрузчик классов для автоматического обнаружения доступных динамических линкеров с защитой. Реализации GuardingDynamicLinkerExporter, доступные через этот загрузчик классов, будут автоматически инициализированы с помощью механизма ServiceLoader и линкеры, которые они предоставляют, будут включены в DynamicLinker создаваемые этой фабрикой. Это позволяет обеспечить межъязыковую совместимость, где места вызова, принадлежащие этой языковой среде выполнения, могут быть связаны линкерами из этих автоматически обнаруженных сред выполнения, если их собственные объекты передаются в эту среду выполнения. Если загрузчик классов не установлен явно, вызывая этот метод, то будет использован контекстный загрузчик классов потока, вызывающего 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- новый порог. Должен быть не меньше нуля. Значение ноль означает, что места вызова никогда не будут считаться нестабильными. - См. также:
LinkRequest.isCallSiteUnstable()
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(). В этом случае языковая среда выполнения может установить свою собственную стратегию автоматического преобразования, которая может обрабатывать нулевые значения. Обратите внимание, что когда вызывается 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, когда экспортер, который пыталась загрузить фабрика:
- не имел разрешения на выполнение, названного
GuardingDynamicLinkerExporter.AUTOLOAD_PERMISSION_NAME, в системе с менеджером безопасности, или - вернул null из
Supplier.get(), или - список, возвращённый из
Supplier.get(), содержал null-элемент.
- Возвращает:
- неизменяемый список обнаруженных
ServiceConfigurationError. Может быть пустым.
© 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/jdk.dynalink/jdk/dynalink/DynamicLinkerFactory.html