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

クラスMethodHandleProxies


  • public class MethodHandleProxies
    extends Object
    このクラスはstaticメソッドのみで構成され、メソッド・ハンドルをインタフェースなどのその他のJVM型に適応させるときに役立ちます。
    導入されたバージョン:
    1.7
    • メソッドの詳細

      • asInterfaceInstance

        public static <T> T asInterfaceInstance​(Class<T> intfc,
                                                MethodHandle target)
        指定されたメソッド・ハンドルに呼出しをリダイレクトする、指定された単一メソッド・インタフェースのインスタンスを生成します。

        単一メソッド・インタフェースとは、一意の名前を持つメソッドが宣言されたインタフェースのことです。 単一メソッド・インタフェースの一意の名前を持つメソッドを決定するときには、Objectのpublicメソッド(toStringequalshashCode)は無視されます。 たとえば、Comparatorは、Object.equalsメソッドが宣言し直されていても、単一メソッド・インタフェースです。

        インタフェースはpublicでなければいけません。 追加のアクセス・チェックは一切実行されません。

        結果となる要求された型のインスタンスは、その型の一意の名前を持つメソッドの呼出しに対する応答として、指定されたターゲットを入力引数に対して呼び出し、ターゲットから返されたもの(またはスローされたもの)をそのまま返します(またはスローします)。 この呼出しは、target.invokeを使用する場合と同じです。 インスタンスの作成前に、asType呼び出しと同様にターゲットの型がチェックされ、その結果、WrongMethodTypeExceptionが発行される可能性があります。

        一意の名前を持つメソッドは、異なる型記述子を使って複数回宣言できます。 (たとえば、オーバーロードやブリッジ・メソッドの所有が可能。) そのような宣言はすべて、ターゲット・メソッド・ハンドルに直接接続されます。 引数や戻り値の型は、個々の宣言ごとにasTypeによって調整されます。

        ラッパー・インスタンスは、要求されたインタフェースとそのスーパー・タイプは実装しますが、その他の単一メソッド・インタフェースは一切実装しません。 これは、要求されなかった型のinstanceofテストにインスタンスが予想外にパスすることがないことを意味します。

        実装上のノート: したがって、各インスタンスは一意の単一メソッド・インタフェースを実装する必要があります。 実装は、AWTEventMulticasterのようにして、複数の単一メソッド・インタフェースを単一の実装クラスにまとめることはできません。

        メソッド・ハンドルから未宣言に関する例外がスローされる可能性がありますが、これは、要求された型の単一の抽象メソッドで宣言されていないチェック例外(またはその他のチェック対象のスロー可能オブジェクト)が存在することを意味します。 これが発生した場合、そのスロー可能オブジェクトがUndeclaredThrowableExceptionのインスタンス内にラップされ、そのラップされた形式でスローされます。

        asInterfaceInstanceInteger.valueOfと同様に、結果がその動作によって定義されるようなファクトリ・メソッドです。 すべての呼出しで新しいインスタンスが返されることは、保証されません。

        ブリッジ・メソッドやその他の特殊なケースが存在する可能性があるため、名前は同じだが記述子(戻り値やパラメータの型)が異なるような抽象メソッドが、インタフェース内にいくつか含まれることがあります。 この場合、指定された1つのターゲットにすべてのメソッドが一緒にバインドされます。 型チェックとasType相当の変換が各メソッド型記述子に適用され、すべての抽象メソッドが共通のターゲットにバインドされます。 この型チェックのほかには、抽象メソッドが何らかのかたちで関係していることを確認するためのチェックは一切行われません。

        このAPIの将来のバージョンでは、単一の抽象メソッドを含む抽象クラスなど、追加の型を受け入れるようになる可能性があります。 さらにこのAPIの将来のバージョンでは、1つ以上の追加のpublic「マーカー」インタフェースを持つラッパー・インスタンスが用意される可能性もあります。

        セキュリティ・マネージャがインストールされている場合、このメソッドは呼出し元依存です。 返されるラッパーを介してターゲット・メソッド・ハンドルの呼出し中、ラッパーの元の作成者(呼出し元)は、セキュリティ・マネージャによって要求されるコンテキスト・チェックに対して可視になります。

        型パラメータ:
        T - ラッパーの期待される型、単一メソッド・インタフェース
        パラメータ:
        intfc - Tを表すクラス・オブジェクト
        target - ラッパーから呼び出すメソッド・ハンドル
        戻り値:
        指定されたターゲットに対する正しい型のラッパー
        例外:
        NullPointerException - どちらかの引数がnullの場合
        IllegalArgumentException - intfcがこのメソッドの有効な引数でない場合
        WrongMethodTypeException - 要求されたインタフェースで必要とされる型にターゲットを変換できない場合
      • isWrapperInstance

        public static boolean isWrapperInstance​(Object x)
        指定されたオブジェクトが、asInterfaceInstanceへの呼出しによって生成されたものかどうかを判定します。
        パラメータ:
        x - 任意の参照
        戻り値:
        参照がnullでなく、asInterfaceInstanceによって生成されたオブジェクトを指している場合はtrue
      • wrapperInstanceTarget

        public static MethodHandle wrapperInstanceTarget​(Object x)
        このラッパー・インスタンスの一意のメソッドと動作が同等であるターゲット・メソッド・ハンドルを生成または回復します。 オブジェクトxは、asInterfaceInstanceへの呼出しによって生成されたものでなければいけません。 この要件をテストするには、isWrapperInstanceを使用します。
        パラメータ:
        x - 任意の参照
        戻り値:
        一意のメソッドを実装したメソッド・ハンドル
        例外:
        IllegalArgumentException - 参照xがラッパー・インスタンスに対するものでない場合
      • wrapperInstanceType

        public static Class<?> wrapperInstanceType​(Object x)
        このラッパー・インスタンスが作成されたときの一意の単一メソッド・インタフェースの型を回復します。 オブジェクトxは、asInterfaceInstanceへの呼出しによって生成されたものでなければいけません。 この要件をテストするには、isWrapperInstanceを使用します。
        パラメータ:
        x - 任意の参照
        戻り値:
        ラッパーが作成されたときの単一メソッド・インタフェースの型
        例外:
        IllegalArgumentException - 参照xがラッパー・インスタンスに対するものでない場合