Spec-Zone.ru › OpenJDK 21

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

Краткое описание методов

Модификатор и тип Метод Описание
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 для создания связи.
Параметры:
callSite - сайт вызова для связи.
Возвращает:
сайт вызова, для удобства цепочки вызовов.

getLinkerServices

public LinkerServices getLinkerServices()
Возвращает объект, представляющий сервисы обработчика этого класса, которые обычно предоставляются индивидуальным language-specific linkers. Хотя как пользователь этого класса вы обычно заботитесь только о методе link(RelinkableCallSite), в определённых обстоятельствах вы можете захотеть использовать низкоуровневые сервисы напрямую; либо для поиска конкретных обработчиков методов, доступа к преобразователям типов и т. д.
Возвращает:
объект, представляющий сервисы обработчика этого класса.

getLinkedCallSiteLocation

public static StackTraceElement getLinkedCallSiteLocation()
Возвращает элемент стека вызовов, описывающий расположение сайта вызова invokedynamic в текущей потоке. Операция потенциально затратна, так как требует генерации стека вызовов для проверки, и предназначена для использования в диагностическом коде. Для «плавающих» сайтов вызовов (не связанных с инструкцией invokedynamic результат не определён.
Возвращает:
элемент стека вызовов, описывающий расположение сайта вызова, который в данный момент связывается, или null, если вызов не произошёл во время связывания сайта вызова.

© 1993, 2023, 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/21/docs/api/jdk.dynalink/jdk/dynalink/DynamicLinker.html

Spec-Zone.ru

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