モジュール java.base
パッケージ java.lang.invoke

クラスConstantCallSite



  • public class ConstantCallSite
    extends CallSite
    ConstantCallSiteは、永続的で決して変更できないターゲットを持つCallSiteです。 ConstantCallSiteにリンクされたinvokedynamic命令は、そのコール・サイトのターゲットに永続的にバインドされます。
    導入されたバージョン:
    1.7
    • コンストラクタの詳細

      • ConstantCallSite

        public ConstantCallSite​(MethodHandle target)
        永続的なターゲットを持つコール・サイトを作成します。
        パラメータ:
        target - このコール・サイトに永続的に関連付けるターゲット
        例外:
        NullPointerException - 提案されたターゲットがnullの場合
      • ConstantCallSite

        protected ConstantCallSite​(MethodType targetType,
                                   MethodHandle createTargetHook)
                            throws Throwable
        永続的なターゲットを持つコール・サイトを作成します(コール・サイト自体にバインドされる場合があります)。

        コール・サイトの構築中、(MethodHandle) createTargetHook.invoke(this)の形式の呼出しを行った場合と同様に、createTargetHookが呼び出されて実際のターゲットが生成されます。

        ユーザー・コードはサブクラスのコンストラクタ内でそのようなアクションを直接実行することはできませんが、これは、ConstantCallSiteコンストラクタから戻る前にターゲットが固定される必要があるからです。

        フックはこのコール・サイトをターゲット・メソッド・ハンドルにバインドするよう指示されるので、通常のアクションはsomeTarget.bindTo(this)になります。 ただし、フックはどのようなアクションでも自由に行えます(コール・サイトを無視して定数ターゲットを返すなど)。

        フックから返される結果は、コール・サイトと厳密に同じ型のメソッド・ハンドルでなければいけません。

        フックが呼び出されている間、新しいConstantCallSiteオブジェクトは部分的に構築された状態になっています。 この状態でgetTargetの呼び出しやターゲットを使用するその他の試みを行うと、IllegalStateExceptionが発行されます。 typeメソッドを使ってコール・サイトの型を取得することは、どのような状況でも問題ありません。

        パラメータ:
        targetType - このコール・サイトに永続的に関連付けるメソッド・ハンドルの型
        createTargetHook - コール・サイトのターゲットを生成するために(コール・サイト上で)呼び出すメソッド・ハンドル
        例外:
        WrongMethodTypeException - 要求された引数でフックを呼び出せない場合、またはフックから返されたターゲットの型が指定されたtargetTypeでない場合
        NullPointerException - フックからnull値が返された場合
        ClassCastException - フックからMethodHandle以外の値が返された場合
        Throwable - フック関数からスローされるその他なにか