Spec-Zone.ru › OpenJDK 24

Класс 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>
T
link(T callSite)
Связывает место вызова invokedynamic.

Методы, объявленные в классе java.lang.Object

clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

Подробное описание методов

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, если оно не вызывается во время связывания места вызова.

Отправить отчет об ошибке или предложить улучшение
Для получения дополнительной информации об API и документации по разработке см. Документацию Java SE, в которой содержатся более подробные, ориентированные на разработчиков описания с концептуальными обзорами, определениями терминов, решениями и рабочими примерами кода. Другие версии.
Java является товарным знаком или зарегистрированным товарным знаком Oracle и/или ее аффилированных лиц в США и других странах.
Авторские права © 1993, 2025, Oracle и/или ее аффилированные лица, 500 Oracle Parkway, Redwood Shores, CA 94065 США.
Все права защищены. Использование подчиняется условиям лицензии и политике перераспределения документации.
DRAFT 24-ea+36-Debian-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.
https://download.java.net/java/early_access/jdk24/docs/api/jdk.dynalink/jdk/dynalink/DynamicLinker.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API