Класс 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. Он установит обработчик метода в вызов, который вызовет механизм перепривязки этого загрузчика. При следующем вызове вызова он будет привязываться к фактическим аргументам, с которыми он был вызван.

Параметры типа:
T - конкретный подкласс RelinkableCallSite, для которого создать привязку.
Параметры:
callSite - вызов для привязки.
Возвращаемое значение:
вызов, для удобства цепочки вызовов.

getLinkerServices()

public LinkerServices getLinkerServices()

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

Возвращаемое значение:
объект, представляющий сервисы загрузчика этого класса.

getLinkedCallSiteLocation()

public static StackTraceElement getLinkedCallSiteLocation()

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

Возвращаемое значение:
элемент стека вызовов, описывающий местоположение вызова, который в настоящее время привязывается, или null, если он не вызывается, пока привязывается вызов.

© 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/DynamicLinker.html

Spec-Zone .ru
спецификации, руководства, описания, API