Класс 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() |
Возвращает тип цели этой точки вызова. |
Подробное описание методов
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.
https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/invoke/CallSite.html