Класс 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.