Spec-Zone.ru › OpenJDK 25

Класс CallSite

java.lang.Object
java.lang.invoke.CallSite
Прямые известные подклассы:
ConstantCallSite, MutableCallSite, VolatileCallSite
public abstract sealed class CallSite extends Object permits ConstantCallSite, MutableCallSite, VolatileCallSite
CallSite — это хранилище для переменного MethodHandle, который называется его target. Инструкция invokedynamic, связанная с CallSite, перенаправляет все вызовы к текущей цели точки вызова. CallSite может быть связан с несколькими инструкциями invokedynamic либо может быть «свободно плавающим», то есть не связанным ни с одной из них. В любом случае его можно вызвать через связанный дескриптор метода, называемый его динамическим вызывающим объектом.

CallSite — это абстрактный запечатанный класс, который не допускает прямого создания подклассов пользователями. У него есть три непосредственных конкретных незапечатанных подкласса, экземпляры которых можно создавать или от которых можно наследоваться.

  • Если изменяемая цель не требуется, инструкцию invokedynamic можно связать навсегда с помощью постоянной точки вызова.
  • Если требуется изменяемая цель с семантикой volatile-переменной, поскольку изменения цели должны немедленно и достоверно наблюдаться другими потоками, можно использовать volatile-точку вызова.
  • В противном случае, если требуется изменяемая цель, можно использовать изменяемую точку вызова.

Неконстантную точку вызова можно перепривязать, изменив ее цель. Новый целевой объект должен иметь тот же тип, что и предыдущий. Таким образом, хотя точку вызова можно перепривязать к последовательности новых целей, ее тип изменить нельзя.

Ниже приведен пример использования точек вызова и методов загрузки, в котором каждая динамическая точка вызова связывается так, чтобы выводить свои аргументы:

static void test() throws Throwable {
    // THE FOLLOWING LINE IS PSEUDOCODE FOR A JVM INSTRUCTION
    InvokeDynamic[#bootstrapDynamic].baz("baz arg", 2, 3.14);
}
private static void printArgs(Object... args) {
  System.out.println(java.util.Arrays.deepToString(args));
}
private static final MethodHandle printArgs;
static {
  MethodHandles.Lookup lookup = MethodHandles.lookup();
  Class thisClass = lookup.lookupClass();  // (who am I?)
  printArgs = lookup.findStatic(thisClass,
      "printArgs", MethodType.methodType(void.class, Object[].class));
}
private static CallSite bootstrapDynamic(MethodHandles.Lookup caller, String name, MethodType type) {
  // ignore caller and name, but match the type:
  return new ConstantCallSite(printArgs.asType(type));
}
Граф иерархии запечатанных классов:
Sealed class hierarchy graph for CallSiteSealed class hierarchy graph for CallSite
Начиная с версии:
1.7

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

Модификатор и тип Метод Описание
abstract MethodHandle dynamicInvoker()
Создает дескриптор метода, эквивалентный инструкции invokedynamic, связанной с этой точкой вызова.
abstract MethodHandle getTarget()
Возвращает целевой метод точки вызова согласно поведению, определенному для конкретного класса этой точки вызова.
abstract void setTarget(MethodHandle newTarget)
Обновляет целевой метод этой точки вызова согласно поведению, определенному для конкретного класса этой точки вызова.
MethodType type()
Возвращает тип цели этой точки вызова.

Методы, объявленные в классе Object

clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

Подробное описание методов

type

public MethodType type()
Возвращает тип цели этой точки вызова. Хотя цели могут меняться, тип любой точки вызова является постоянным и никогда не может быть изменен на другой тип. Метод setTarget обеспечивает соблюдение этого инварианта, отклоняя любую новую цель, тип которой не совпадает с типом предыдущей цели.
Возвращает:
тип текущей цели, который также является типом любой будущей цели

getTarget

public abstract MethodHandle getTarget()
Возвращает целевой метод точки вызова согласно поведению, определенному для конкретного класса этой точки вызова. Непосредственные подклассы CallSite описывают поведение этого метода, специфичное для соответствующих классов.
Возвращает:
текущее состояние связи точки вызова — ее целевой дескриптор метода
См. также:
  • ConstantCallSite
  • VolatileCallSite
  • setTarget(MethodHandle)
  • ConstantCallSite.getTarget()
  • MutableCallSite.getTarget()
  • VolatileCallSite.getTarget()

setTarget

public abstract void setTarget(MethodHandle newTarget)
Обновляет целевой метод этой точки вызова согласно поведению, определенному для конкретного класса этой точки вызова. Непосредственные подклассы CallSite описывают поведение этого метода, специфичное для соответствующих классов.

Тип новой цели должен быть равен типу старой цели.

Параметры:
newTarget — новая цель
Исключения:
NullPointerException — если предлагаемая новая цель равна null
WrongMethodTypeException — если тип метода предлагаемой новой цели отличается от типа предыдущей цели
См. также:
  • getTarget()
  • ConstantCallSite.setTarget(MethodHandle)
  • MutableCallSite.setTarget(MethodHandle)
  • VolatileCallSite.setTarget(MethodHandle)

dynamicInvoker

public abstract MethodHandle dynamicInvoker()
Создает дескриптор метода, эквивалентный инструкции invokedynamic, связанной с этой точкой вызова.

Этот метод эквивалентен следующему коду:

MethodHandle getTarget, invoker, result;
getTarget = MethodHandles.publicLookup().bind(this, "getTarget", MethodType.methodType(MethodHandle.class));
invoker = MethodHandles.exactInvoker(this.type());
result = MethodHandles.foldArguments(invoker, getTarget)
Возвращает:
дескриптор метода, который всегда вызывает текущую цель этой точки вызова

Сообщить об ошибке или предложить улучшение
Дополнительные справочные материалы по 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/java.base/java/lang/invoke/CallSite.html

Spec-Zone.ru

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