Класс CallSite
- java.lang.Object
-
- java.lang.invoke.CallSite
- Прямые известные подклассы:
-
ConstantCallSite,MutableCallSite,VolatileCallSite
public abstract class CallSite extends Object
Объект CallSite — это контейнер для переменной MethodHandle, которая называется его target. Инструкция invokedynamic , связанная с CallSite, делегирует все вызовы текущей цели сайта. Объект CallSite может быть связан с несколькими инструкциями invokedynamic или может быть «свободно плавающим», не связанным ни с одной из них. В любом случае, к нему можно обратиться через связанный обработчик методов, называемый его динамическим вызывающим объектом.
CallSite — это абстрактный класс, который не позволяет пользователям напрямую создавать подклассы. У него есть три непосредственных конкретных подкласса, которые можно либо создать, либо использовать для создания подклассов.
- Если постоянная цель не требуется, инструкция
invokedynamicможет быть постоянно связана с помощью постоянного вызова сайта. - Если требуется изменчивая цель, которая имеет семантику переменной volatile (обновления цели должны быть немедленно и надёжно замечены другими потоками), можно использовать сайт вызова volatile.
- В противном случае, если требуется изменчивая цель, можно использовать сайт вызова mutable.
Сайт вызова, не являющийся постоянным, может быть пересвязан, изменив его цель. Новая цель должна иметь тот же тип, что и предыдущая цель. Таким образом, хотя сайт вызова может быть пересвязан с серией последовательных целей, он не может изменить свой тип.
Вот пример использования сайтов вызова и методов загрузки, которые связывают каждый динамический сайт вызова с выводом его аргументов:
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, 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.
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/invoke/CallSite.html