Spec-Zone.ru › OpenJDK 24

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

Методы, унаследованные от класса 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, 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://download.java.net/java/early_access/jdk24/docs/api/java.base/java/lang/invoke/CallSite.html

Spec-Zone.ru

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