Класс 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)); }
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
abstract MethodHandle |
dynamicInvoker() |
Создаёт дескриптор метода, эквивалентный инструкции invokedynamic, связанной с этой точкой вызова. |
abstract MethodHandle |
getTarget() |
Возвращает целевой метод точки вызова в соответствии с поведением, определённым конкретным классом этой точки вызова. |
abstract void |
setTarget |
Обновляет целевой метод этой точки вызова в соответствии с поведением, определённым конкретным классом этой точки вызова. |
MethodType |
type() |
Возвращает тип цели этой точки вызова. |
Методы, объявленные в классе Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait | Модификатор и тип | Метод | Описание |
|---|---|---|
protected Object |
clone() |
Создаёт и возвращает копию этого объекта. |
boolean |
equals |
Указывает, равен ли какой-либо другой объект этому объекту. |
protected void |
finalize() |
Устарело, планируется удаление: этот элемент API планируется удалить в будущей версии. Финализация устарела и планируется к удалению в одном из будущих выпусков. |
final Class |
getClass() |
Возвращает класс времени выполнения этого Object. |
int |
hashCode() |
Возвращает хеш-код этого объекта. |
final void |
notify() |
Пробуждает один поток, ожидающий на мониторе этого объекта. |
final void |
notifyAll() |
Пробуждает все потоки, ожидающие на мониторе этого объекта. |
String |
toString() |
Возвращает строковое представление объекта. |
final void |
wait() |
Заставляет текущий поток ожидать пробуждения, обычно посредством уведомления или прерывания. |
final void |
wait |
Заставляет текущий поток ожидать пробуждения, обычно посредством уведомления или прерывания, либо до истечения заданного промежутка реального времени. |
final void |
wait |
Заставляет текущий поток ожидать пробуждения, обычно посредством уведомления или прерывания, либо до истечения заданного промежутка реального времени. |
Подробное описание методов
type
public MethodType type()
setTarget обеспечивает соблюдение этого инварианта, отклоняя любую новую цель, тип которой отличается от типа предыдущей цели.- Возвращает:
- тип текущей цели, который также будет типом любой будущей цели
getTarget
public abstract MethodHandle getTarget()
CallSite описывают поведение этого метода, специфичное для каждого класса.- Возвращает:
- текущее состояние связывания точки вызова — дескриптор её целевого метода
- См. также:
setTarget
public abstract void setTarget(MethodHandle newTarget)
CallSite описывают поведение этого метода, специфичное для каждого класса. Тип новой цели должен быть равен типу старой цели.
- Параметры:
-
newTarget— новая цель - Выбрасывает:
-
NullPointerException— если предлагаемая новая цель равна null -
WrongMethodTypeException— если тип метода предлагаемой новой цели отличается от типа предыдущей цели - См. также:
dynamicInvoker
public abstract MethodHandle dynamicInvoker()
Этот метод эквивалентен следующему коду:
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.