Класс DynamicLinker
java.lang.Object
jdk.dynalink.DynamicLinker
public final class DynamicLinker extends Object
Линкер для объектов
RelinkableCallSite. Динамический линкер — один из основных объектов при использовании Dynalink; он координирует связывание точек вызова с линкерами доступных сред выполнения языков, представленными объектами GuardingDynamicLinker (вам потребуется работать с ними, только если вы сами реализуете среду выполнения языка с собственной объектной моделью и/или преобразованиями типов). Чтобы использовать Dynalink, необходимо создать один или несколько динамических линкеров с помощью DynamicLinkerFactory. Затем необходимо вызвать его метод link(RelinkableCallSite) из методов bootstrap 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> |
link |
Связывает точку вызова invokedynamic. |
Методы, объявленные в классе Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait | Модификатор и тип | Метод | Описание |
|---|---|---|
protected Object |
clone() |
Создаёт и возвращает копию этого объекта. |
boolean |
equals |
Указывает, равен ли этот объект другому объекту. |
protected void |
finalize() |
Устарело, будет удалено: этот элемент API может быть удалён в будущей версии. Финализация объявлена устаревшей и может быть удалена в будущем выпуске. |
final Class |
getClass() |
Возвращает класс времени выполнения этого Object. |
int |
hashCode() |
Возвращает хеш-код этого объекта. |
final void |
notify() |
Пробуждает один поток, ожидающий на мониторе этого объекта. |
final void |
notifyAll() |
Пробуждает все потоки, ожидающие на мониторе этого объекта. |
String |
toString() |
Возвращает строковое представление объекта. |
final void |
wait() |
Заставляет текущий поток ожидать пробуждения, обычно в результате вызова notify или interrupt. |
final void |
wait |
Заставляет текущий поток ожидать пробуждения, обычно в результате вызова notify или interrupt, либо до истечения заданного промежутка реального времени. |
final void |
wait |
Заставляет текущий поток ожидать пробуждения, обычно в результате вызова notify или interrupt, либо до истечения заданного промежутка реального времени. |
Подробное описание методов
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, если метод вызван не во время связывания точки вызова.
© 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.