Spec-Zone.ru › OpenJDK 25

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

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

Модификатор и тип Метод Описание
static StackTraceElement getLinkedCallSiteLocation()
Возвращает элемент трассировки стека, описывающий расположение точки вызова invokedynamic, связываемой в данный момент в текущем потоке.
LinkerServices getLinkerServices()
Возвращает объект, представляющий службы связывания этого класса, которые обычно доступны отдельным объектам language-specific linkers.
<T extends RelinkableCallSite>
T
link(T callSite)
Связывает точку вызова invokedynamic.

Методы, объявленные в классе 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 — точка вызова, которую необходимо связать.
Возвращает:
callSite для удобного объединения вызовов.

getLinkerServices

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

getLinkedCallSiteLocation

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

Сообщить об ошибке или предложить улучшение
Дополнительную справочную информацию по API и документацию для разработчиков см. в документации Java SE, содержащей более подробные описания для разработчиков, обзоры концепций, определения терминов, обходные решения и примеры работающего кода. Другие версии.
Java является товарным знаком или зарегистрированным товарным знаком Oracle и/или ее аффилированных лиц в США и других странах.
Авторское право © 1993, 2025, Oracle и/или ее аффилированные лица, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
Все права защищены. Использование регулируется условиями лицензии и политикой распространения документации.

© 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://docs.oracle.com/en/java/javase/25/docs/api/jdk.dynalink/jdk/dynalink/DynamicLinker.html

Spec-Zone.ru

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