Spec-Zone.ru › OpenJDK 17

Класс 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 для создания привязки.
Parameters:
callSite - вызов для привязки.
Returns:
вызов, для удобства цепочки вызовов.

getLinkerServices

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

getLinkedCallSiteLocation

public static StackTraceElement getLinkedCallSiteLocation()
Возвращает элемент трассировки стека, описывающий местоположение вызова invokedynamic объекта, который в настоящее время привязывается в текущей нити. Операция потенциально дорогостоящая, так как ей требуется сгенерировать трассировку стека для проверки, и она предназначена для использования в диагностическом коде. Для «плавающих» вызовов (не связанных с инструкцией invokedynamic ), результат не определен.
Returns:
элемент трассировки стека, описывающий местоположение вызова, который в настоящее время привязывается, или 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/DynamicLinker.html

Spec-Zone.ru

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