Spec-Zone .ru
спецификации, руководства, описания, API
|
public abstract class CallSite extends Object
CallSite
держатель для переменной MethodHandle
, который вызывают target
. invokedynamic
инструкция, соединенная с a CallSite
делегаты все звонки в текущую цель сайта. A CallSite
может быть связан с несколькими invokedynamic
инструкции, или это может быть "свободное плавание", связанный ни с одним. В любом случае это может быть вызвано через связанный дескриптор метода, названный его динамическим invoker.
CallSite
абстрактный класс, который не позволяет прямое разделение на подклассы пользователями. У этого есть три непосредственных, конкретных подкласса, которые можно или инстанцировать или разделены на подклассы.
invokedynamic
инструкция может быть постоянно связана посредством постоянного сайта вызова. Непостоянный сайт вызова может быть повторно соединен, изменяя его цель. У новой цели должен быть тот же самый тип как предыдущая цель. Таким образом, хотя сайт вызова может быть повторно соединен с серией последовательных целей, он не может изменить свой тип.
Вот демонстрационное использование сайтов вызова и методов начальной загрузки, который соединяет каждый динамический сайт вызова, чтобы напечатать его параметры:
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(MethodHandle newTarget)
Обновляет целевой метод этого сайта вызова, согласно поведению, определенному определенным классом сайта этого вызова.
|
MethodType |
type()
Возвращает тип этой цели сайта вызова.
|
public MethodType type()
setTarget
метод осуществляет этот инвариант, отказываясь от любой новой цели, у которой нет типа предыдущей цели.public abstract MethodHandle getTarget()
CallSite
задокументируйте специфичные для класса поведения этого метода.ConstantCallSite
, VolatileCallSite
, setTarget(java.lang.invoke.MethodHandle)
, ConstantCallSite.getTarget()
, MutableCallSite.getTarget()
, VolatileCallSite.getTarget()
public abstract void setTarget(MethodHandle newTarget)
CallSite
задокументируйте специфичные для класса поведения этого метода. Тип новой цели должен быть равным типу старой цели.
newTarget
- новая цельNullPointerException
- если предложенная новая цель является нулемWrongMethodTypeException
- если у предложенной новой цели есть тип метода, который отличается от предыдущей целиgetTarget()
, ConstantCallSite.setTarget(java.lang.invoke.MethodHandle)
, MutableCallSite.setTarget(java.lang.invoke.MethodHandle)
, VolatileCallSite.setTarget(java.lang.invoke.MethodHandle)
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)
Для дальнейшей ссылки API и документации разработчика, см.
Авторское право © 1993, 2011, Oracle и/или его филиалы. Все права защищены.