public abstract class CallSite extends Object
CallSite は、ターゲットと呼ばれる変数 MethodHandle のホルダーです。CallSite にリンクされた invokedynamic 命令は、すべての呼び出しをそのサイトの現在のターゲットに委譲します。CallSite は、いくつかの invokedynamic 命令に関連付けることができ、どの命令にも関連付けられていない「フリーフローティング」の状態にすることもできます。いずれにしても、動的インボーカと呼ばれる関連付けられたメソッドハンドルを通じて呼び出すことができます。
CallSite は、ユーザーによる直接的なサブクラス化を許可しない抽象クラスです。その直下には、インスタンス化やサブクラス化を行える具象サブクラスが 3 つあります。
invokedynamic 命令を永続的にバインドできます。
定数でないコールサイトは、ターゲット変更による再リンクが可能です。新しいターゲットは以前のターゲットと同じ型を持つ必要があります。したがって、1 つのコールサイトを一連のターゲットに次々と再リンクすることはできますが、その型を変更することはできません。
コールサイトとブートストラップメソッドを使用してすべての動的コールサイトをリンクし、引数を出力する例を次に示します。
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 - 提案された新しいターゲットが null の場合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 リファレンスおよび開発者ドキュメントについては、Java SE のドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright © 1993, 2013, Oracle and/or its affiliates. All rights reserved.