Spec-Zone.ru › OpenJDK 21

Класс CallSite

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

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

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

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

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


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()
Возвращает тип целевого объекта этого сайта вызова.

Методы, объявленные в классе java.lang.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(java.lang.invoke.MethodHandle)
  • ConstantCallSite.getTarget()
  • MutableCallSite.getTarget()
  • VolatileCallSite.getTarget()

setTarget

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

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

Параметры:
newTarget - новая цель
Исключения:
NullPointerException - если предложенная новая цель равна null
WrongMethodTypeException - если у предложенной новой цели тип метода отличается от предыдущей цели
См. также:
  • getTarget()
  • ConstantCallSite.setTarget(java.lang.invoke.MethodHandle)
  • MutableCallSite.setTarget(java.lang.invoke.MethodHandle)
  • VolatileCallSite.setTarget(java.lang.invoke.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)
 
Возвращает:
обработчик метода, который всегда вызывает текущую цель этого сайта вызова

© 1993, 2023, 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/21/docs/api/java.base/java/lang/invoke/CallSite.html

Spec-Zone.ru

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