Spec-Zone.ru › OpenJDK 8

Класс CallSite

  • java.lang.Object
    • java.lang.invoke.CallSite
Прямые известные подклассы:
ConstantCallSite, MutableCallSite, VolatileCallSite

public abstract class CallSite
extends Object

A CallSite — это хранилище для переменной MethodHandle, которая называется его target. Инструкция invokedynamic , связанная с CallSite, делегирует все вызовы текущему целевому объекту сайта. A CallSite может быть связан с несколькими инструкциями invokedynamic, или он может быть «свободно плавающим», не связанным ни с одной. В любом случае, он может быть вызван через связанный метод-обработчик, называемый его динамическим вызывающим методом.

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

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

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

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

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));
}

Методы

Модификатор и тип Метод и описание
abstract MethodHandle dynamicInvoker()

Создаёт метод-обработчик, эквивалентный инструкции invokedynamic, которая была связана с этим call site.

abstract MethodHandle getTarget()

Возвращает целевой метод call site в соответствии с поведением, определённым конкретным классом этого call site.

abstract void setTarget(MethodHandle newTarget)

Обновляет целевой метод этого call site в соответствии с поведением, определённым конкретным классом этого call site.

MethodType type()

Возвращает тип целевого объекта этого call site.

Методы, унаследованные от класса java.lang.Object

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

Методы

type

public MethodType type()

Возвращает тип целевого объекта этого call site. Хотя целевые объекты могут изменяться, тип любого call site является постоянным и никогда не может измениться на неравный тип. Метод setTarget обеспечивает этот инвариант, отказываясь от любого нового целевого объекта, тип которого не совпадает с типом предыдущего целевого объекта.

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

getTarget

public abstract MethodHandle getTarget()

Возвращает целевой метод call site в соответствии с поведением, определённым конкретным классом этого call site. Непосредственные подклассы CallSite документируют поведенческие особенности этого метода, специфичные для класса.

Возвращает:
текущее состояние связывания call site, его целевой метод-обработчик
См. также:
ConstantCallSite, VolatileCallSite, setTarget(java.lang.invoke.MethodHandle), ConstantCallSite.getTarget(), MutableCallSite.getTarget(), VolatileCallSite.getTarget()

setTarget

public abstract void setTarget(MethodHandle newTarget)

Обновляет целевой метод этого call site в соответствии с поведением, определённым конкретным классом этого call site. Непосредственные подклассы 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, которая была связана с этим call site.

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

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

© 1993, 2020, 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.

Spec-Zone.ru

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