Spec-Zone.ru › OpenJDK 17

Класс CallSite

java.lang.Object
java.lang.invoke.CallSite
Прямые известные подклассы:
ConstantCallSite, MutableCallSite, VolatileCallSite
public abstract class CallSite extends Object
Объект-держатель для переменной MethodHandle, которая называется его target. Инструкция CallSite , связанная с 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));
}
С:
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, 2021, 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/17/docs/api/java.base/java/lang/invoke/CallSite.html

Spec-Zone.ru

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