Интерфейс LinkerServices
public interface LinkerServices
Интерфейс для сервисов, предоставляемых экземплярам
GuardingDynamicLinker объектом DynamicLinker, который их владеет.Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
MethodHandle |
asType |
Аналогично MethodHandle.asType(MethodType), но также подключает обработчики методов, созданные всеми доступными реализациями GuardingTypeConverterFactory, предоставляя языкоспецифическую кодировку параметров. |
default MethodHandle |
asTypeLosslessReturn |
Аналогично asType(MethodHandle, MethodType), но обрабатывает преобразование типа возвращаемого значения особо. |
boolean |
canConvert |
Возвращает true, если может существовать преобразование между запрошенными типами (автоматическое преобразование JVM или предоставленное любыми доступными реализациями GuardingTypeConverterFactory), или false, если преобразование между запрошенными типами определённо не существует. |
ConversionComparator.Comparison |
compareConversion |
Определяет, какое из двух преобразований типа от исходного типа к двум целевым типам предпочтительнее. |
MethodHandle |
filterInternalObjects |
Изменяет обработчик метода так, чтобы любые параметры, которые могут получать потенциальные внутренние объекты выполнения языка, имели добавленный фильтр, чтобы предотвратить их утечку, возможно, путем их обертывания. |
GuardedInvocation |
getGuardedInvocation |
Создаёт защищённое вызов, делегируя обратно объекту DynamicLinker, который экспонирует этот объект сервисов линковки. |
MethodHandle |
getTypeConverter |
Принимая исходный и целевой тип, возвращает обработчик метода, который преобразует между ними. |
<T> T |
getWithLookup |
Выполняет операцию в контексте объекта поиска MethodHandles.Lookup. |
Подробное описание методов
asType
MethodHandle asType(MethodHandle handle, MethodType fromType)
Аналогично
MethodHandle.asType(MethodType), за исключением того, что она также подключает обработчики методов, созданные всеми доступными GuardingTypeConverterFactory реализациями, обеспечивая языкоспецифическое приведение типов параметров. Она будет применять MethodHandle.asType(MethodType) для всех преобразований примитивный-примитивный, обёртка-примитивный, примитивный-обёртка, а также для всех расширений типов. Для всех остальных преобразований она вставит MethodHandles.filterArguments(MethodHandle, int, MethodHandle...) с составными фильтрами, предоставленными реализациями GuardingTypeConverterFactory.- Параметры:
-
handle- целевой обработчик метода -
fromType- типы исходных аргументов - Возвращает:
- обработчик метода, являющийся подходящей комбинацией
MethodHandle.asType(MethodType),MethodHandles.filterArguments(MethodHandle, int, MethodHandle...)иMethodHandles.filterReturnValue(MethodHandle, MethodHandle)с преобразователями типов, произведённымиGuardingTypeConverterFactory, в качестве фильтров.
asTypeLosslessReturn
default MethodHandle asTypeLosslessReturn(MethodHandle handle, MethodType fromType)
Аналогично
asType(MethodHandle, MethodType), за исключением того, что она обрабатывает преобразование типа возвращаемого значения особо. Она преобразует тип возвращаемого значения обработчика метода только тогда, когда это можно сделать с помощью преобразования, не теряющего ни точности, ни величины; в противном случае она оставляет его неизменным. Это единственные преобразования возвращаемого значения, которые должны выполняться отдельными языкоспецифическими линкерами, и pre-link transformer of the dynamic linker должен реализовать стратегию для обработки потенциально потери точности преобразований возвращаемого типа специфичным для языковой среды способом, где находится место вызова.- Параметры:
-
handle- целевой обработчик метода -
fromType- типы исходных аргументов - Возвращает:
- обработчик метода, являющийся подходящей комбинацией
MethodHandle.asType(MethodType)иMethodHandles.filterArguments(MethodHandle, int, MethodHandle...)с преобразователями типов, произведённымиGuardingTypeConverterFactory, в качестве фильтров.
getTypeConverter
MethodHandle getTypeConverter(Class<?> sourceType, Class<?> targetType)
Учитывая исходный и целевой тип, возвращает обработчик метода, который преобразует между ними. Никогда не возвращает null; в худшем случае он вернёт тождественное преобразование (которое может потерпеть неудачу для некоторых значений во время выполнения). Вам редко нужно использовать этот метод напрямую, и вы должны в основном полагаться на
asType(MethodHandle, MethodType) вместо этого. Этот метод необходим, когда вам нужно повторно использовать существующую механику преобразования типов вне контекста обработки запроса на ссылку.- Параметры:
-
sourceType- тип, из которого нужно преобразовать -
targetType- тип, в который нужно преобразовать - Возвращает:
- обработчик метода, выполняющий преобразование.
canConvert
boolean canConvert(Class<?> from, Class<?> to)
Возвращает true, если может существовать преобразование между запрошенными типами (либо автоматическое преобразование JVM, либо одно, предоставленное любым доступным
GuardingTypeConverterFactory), или false, если определённо не существует преобразования между запрошенными типами. Обратите внимание, что возвращение true не гарантирует, что преобразование будет успешным во время выполнения для всех значений (особенно если типы "от" или "до" достаточно обобщены), но возвращение false гарантирует, что оно потерпит неудачу.- Параметры:
-
from- исходный тип для преобразования -
to- целевой тип для преобразования - Возвращает:
- true, если может быть преобразование, false, если не может.
getGuardedInvocation
GuardedInvocation getGuardedInvocation(LinkRequest linkRequest) throws Exception
Создаёт защищённый вызов, делегирующий обратно
DynamicLinker, который предоставляет этот объект службы линковщика. Динамический линковщик затем сам делегирует связывание всем своим управляемым GuardingDynamicLinker, включая потенциально этот, если ни один линковщик не отреагирует раньше, так что будьте осторожны с бесконечной рекурсией. Обычно вы создаёте запрос на ссылку таким образом, чтобы он отличался от запроса, который вы сейчас пытаетесь связать.- Параметры:
-
linkRequest- запрос на связывание вызова - Возвращает:
- защищённый вызов, связанный некоторыми из защищённых динамических линковщиков, управляемых верхнеуровневым динамическим линковщиком. Может быть null, если ни один доступный линковщик не может связать вызов. Обычно вы используете элементы возвращённого вызова для составления собственного вызова.
- Исключения:
-
Exception- в случае, если верхнеуровневый линковщик выбросит исключение
compareConversion
ConversionComparator.Comparison compareConversion(Class<?> sourceType, Class<?> targetType1, Class<?> targetType2)
Определяет, какое из двух преобразований типа от исходного типа к двум целевым типам предпочтительнее. Это используется для динамического разрешения перегруженных методов. Если исходный тип преобразуется точно в один целевой тип с помощью преобразования вызова метода, он выбирается; в противном случае используются доступные
ConversionComparator.- Параметры:
-
sourceType- исходный тип. -
targetType1- один потенциальный целевой тип -
targetType2- другой потенциальный целевой тип. - Возвращает:
- один из констант сравнения, которые устанавливают, какой – если есть – из целевых типов предпочтительнее для преобразования.
filterInternalObjects
MethodHandle filterInternalObjects(MethodHandle target)
Изменяет обработчик метода так, чтобы любые параметры, которые могут получать потенциально внутренние объекты среды выполнения языка, имели фильтр, добавленный к ним, чтобы предотвратить их утечку, возможно, посредством обёртки. Он также может потенциально добавить фильтр разворачивания к возвращаемому значению. В основном преобразует обработчик метода, используя преобразователь, настроенный с помощью
DynamicLinkerFactory.setInternalObjectsFilter(MethodHandleTransformer).- Параметры:
-
target- целевой обработчик метода - Возвращает:
- обработчик метода с параметрами и/или возвращаемым типом, потенциально отфильтрованными для обёртки и разворачивания.
getWithLookup
<T> T getWithLookup(Supplier<T> operation, SecureLookupSupplier lookupSupplier)
Выполняет операцию в контексте конкретного объекта поиска
MethodHandles.Lookup. Обычно методы на LinkerServices вызываются в рамках механизма связывания, в котором Dynalink внутренне поддерживает текущий поиск по потоку (принадлежащий описателю места вызова, который связывается). Этот поиск может быть получен любым GuardingTypeConverterFactory, участвующим в связывании, если ему нужно сгенерировать чувствительные к поиску преобразователи. Однако методы служб линковщика могут вызываться и вне процесса связывания, когда реализуются схемы распределения вызовов во время вызова, вызываются преобразования во время выполнения и т. д. Если возникает необходимость в использовании любого преобразователя типа в этой ситуации, и он нуждается в поиске, обычно он получит только MethodHandles.publicLookup(), так как поток не участвует в операции связывания. Если существует способ осмысленно связать операцию с контекстом какого-либо класса вызывающего абонента, рассмотрите выполнение её внутри вызова этого метода и передачу полноценного поиска для этого класса, так как это свяжет этот поиск с текущим потоком на время выполнения операции. Поскольку вы передаёте SecureLookupSupplier, любые вызываемые фабрики преобразователей типов всё равно должны иметь необходимые разрешения на выполнение для получения поиска, если им это понадобится.- Тип параметров:
-
T- тип возвращаемого значения, предоставляемого переданным поставщиком. - Параметры:
-
operation- операция, выполняемая в контексте указанного поиска. -
lookupSupplier- безопасный поставщик поиска - Возвращает:
- возвращаемое значение действия
- Исключения:
-
NullPointerException- если либо действие, либо lookupSupplier равны null. - См. также:
© 1993, 2021, 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/17/docs/api/jdk.dynalink/jdk/dynalink/linker/LinkerServices.html