Класс DynamicLinker
java.lang.Object
jdk.dynalink.DynamicLinker
public final class DynamicLinker extends Object
Объект-линкер для объектов
RelinkableCallSite. Динамический линкер — это основной объект при использовании Dynalink, он координирует связывание вызовов с линкерами доступных языковых сред выполнения, которые представлены объектами GuardingDynamicLinker (вам нужно взаимодействовать с ними только в том случае, если вы сами реализуете языковую среду выполнения со своей собственной моделью объектов и/или преобразованиями типов). Для использования Dynalink необходимо создать один или несколько динамических линкеров с помощью DynamicLinkerFactory. После этого необходимо вызвать метод link(RelinkableCallSite) из invokedynamic методов начальной загрузки, чтобы позволить ему управлять всеми созданными вызовами. Обычно используется создание как минимум одного класса на языковую среду выполнения, содержащий один экземпляр линкера, как:
class MyLanguageRuntime {
private static final GuardingDynamicLinker myLanguageLinker = new MyLanguageLinker();
private static final DynamicLinker dynamicLinker = createDynamicLinker();
private static DynamicLinker createDynamicLinker() {
final DynamicLinkerFactory factory = new DynamicLinkerFactory();
factory.setPrioritizedLinker(myLanguageLinker);
return factory.createLinker();
}
public static CallSite bootstrap(MethodHandles.Lookup lookup, String name, MethodType type) {
return dynamicLinker.link(
new SimpleRelinkableCallSite(
new CallSiteDescriptor(lookup, parseOperation(name), type)));
}
private static Operation parseOperation(String name) {
...
}
}
. Вышеуказанная настройка с одним статическим экземпляром линкера зачастую недостаточна. Чаще всего в языковой среде выполнения имеется концепция «контекстного загрузчика классов», и вам потребуется создавать по одному динамическому линкеру на каждый такой загрузчик классов, чтобы убедиться, что он включает линтеры всех других языковых сред выполнения, видимых этому загрузчику классов (см. DynamicLinkerFactory.setClassLoader(ClassLoader)).
Для примера выше вам нужно предоставить три компонента:
- Ожидается, что вы предоставите
GuardingDynamicLinkerдля вашего языка. Если ваша среда выполнения не имеет собственной модели объектов или преобразований типов, вам не нужно реализовыватьGuardingDynamicLinker; вы просто не вызываете методsetPrioritizedLinkerв фабрике. - Производительность программ может зависеть от вашего выбора класса для представления мест вызова. В примере выше использовался
SimpleRelinkableCallSite, но вы можете использоватьChainedCallSiteвместо него. Вам нужно будет провести эксперименты и определить, что лучше всего подходит для вашей среды выполнения. Вы можете дополнительно наследовать от одного из них или реализовать свой собственный. - Вам также необходимо предоставить
CallSiteDescriptorдля ваших мест вызова. Это неизменяемые объекты, содержащие всю информацию о месте вызова: класс, выполняющий поиск, вызываемая операция и сигнатура метода. Вам придется предоставить свою собственную схему для кодирования и декодирования операций в имени места вызова или статических параметрах, поэтому в приведенном выше примере методparseOperationоставлен нереализованным.
- Since:
- 9
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
static StackTraceElement |
getLinkedCallSiteLocation() |
Возвращает элемент стека вызовов, описывающий расположение invokedynamic места вызова, которое в данный момент связывается в текущей потоке. |
LinkerServices |
getLinkerServices() |
Возвращает объект, представляющий службы линковки данного класса, которые обычно доступны для отдельных language-specific linkers. |
<T extends RelinkableCallSite> |
link |
Связывает место вызова invokedynamic. |
Подробное описание методов
link
public <T extends RelinkableCallSite> T link(T callSite)
Связывает место вызова invokedynamic. Он установит обработчик метода в месте вызова, который вызовет механизм повторного связывания этого линкера. При следующем вызове места вызова оно будет связано для фактических аргументов, с которыми оно было вызвано.
- Type Parameters:
T- конкретный подклассRelinkableCallSiteдля которого создать ссылку.- Parameters:
-
callSite- место вызова для связывания. - Returns:
- callSite, для удобства цепочки вызовов.
getLinkerServices
public LinkerServices getLinkerServices()
Возвращает объект, представляющий службы линковки данного класса, которые обычно доступны для отдельных
language-specific linkers. В то время как как пользователь данного класса обычно заботится только о методе link(RelinkableCallSite), в определенных обстоятельствах вы можете использовать низкоуровневые службы напрямую, либо для поиска конкретных обработчиков метода, либо для доступа к преобразователям типов и т. д.- Returns:
- объект, представляющий службы линковки данного класса.
getLinkedCallSiteLocation
public static StackTraceElement getLinkedCallSiteLocation()
Возвращает элемент стека вызовов, описывающий расположение
invokedynamic места вызова, которое в данный момент связывается в текущей потоке. Операция потенциально затратная, так как ей нужно сгенерировать стек вызовов для его проверки, и предназначена для использования в диагностическом коде. Для «свободно плавающих» мест вызова (не связанных с инструкцией invokedynamic), результат не определён.- Returns:
- элемент стека вызовов, описывающий расположение места вызова, которое в данный момент связывается, или null, если оно не вызывается во время связывания места вызова.
© 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://download.java.net/java/early_access/jdk24/docs/api/jdk.dynalink/jdk/dynalink/DynamicLinker.html