public class MethodHandleProxies extends Object
修飾子と型 | メソッドと説明 |
---|---|
static <T> T |
asInterfaceInstance(Class<T> intfc, MethodHandle target)
指定されたメソッド・ハンドルに呼出しをリダイレクトする、指定された単一メソッド・インタフェースのインスタンスを生成します。
|
static boolean |
isWrapperInstance(Object x)
指定されたオブジェクトが、
asInterfaceInstance への呼出しによって生成されたものかどうかを判定します。 |
static MethodHandle |
wrapperInstanceTarget(Object x)
このラッパー・インスタンスの一意のメソッドと動作が同等であるターゲット・メソッド・ハンドルを生成または回復します。
|
static Class<?> |
wrapperInstanceType(Object x)
このラッパー・インスタンスが作成されたときの一意の単一メソッド・インタフェースの型を回復します。
|
public static <T> T asInterfaceInstance(Class<T> intfc, MethodHandle target)
単一メソッド・インタフェースとは、一意の名前を持つメソッドが宣言されたインタフェースのことです。単一メソッド・インタフェースの一意の名前を持つメソッドを決定するときには、Object
のpublicメソッド(toString
、equals
、hashCode
)は無視されます。たとえば、Comparator
は、Object.equals
メソッドが宣言し直されていても、単一メソッド・インタフェースです。
インタフェースはpublicでなければいけません。追加のアクセス・チェックは一切実行されません。
結果となる要求された型のインスタンスは、その型の一意の名前を持つメソッドの呼出しに対する応答として、指定されたターゲットを入力引数に対して呼び出し、ターゲットから返されたもの(またはスローされたもの)をそのまま返します(またはスローします)。この呼出しは、target.invoke
を使用する場合と同じです。インスタンスの作成前に、asType
呼び出しと同様にターゲットの型がチェックされ、その結果、WrongMethodTypeException
が発行される可能性があります。
一意の名前を持つメソッドは、異なる型記述子を使って複数回宣言できます。(たとえば、オーバーロードやブリッジ・メソッドの所有が可能。)そのような宣言はすべて、ターゲット・メソッド・ハンドルに直接接続されます。引数や戻り値の型は、個々の宣言ごとにasType
によって調整されます。
ラッパー・インスタンスは、要求されたインタフェースとそのスーパー・タイプは実装しますが、その他の単一メソッド・インタフェースは一切実装しません。これは、要求されなかった型のinstanceof
テストにインスタンスが予想外にパスすることがないことを意味します。
実装上の注意: したがって、各インスタンスは一意の単一メソッド・インタフェースを実装する必要があります。実装は、AWTEventMulticaster
のようにして、複数の単一メソッド・インタフェースを単一の実装クラスにまとめることはできません。
メソッド・ハンドルから未宣言に関する例外がスローされる可能性がありますが、これは、要求された型の単一の抽象メソッドで宣言されていないチェック例外(またはその他のチェック対象のスロー可能オブジェクト)が存在することを意味します。これが発生した場合、そのスロー可能オブジェクトがUndeclaredThrowableException
のインスタンス内にラップされ、そのラップされた形式でスローされます。
asInterfaceInstance
はInteger.valueOf
と同様に、結果がその動作によって定義されるようなファクトリ・メソッドです。すべての呼出しで新しいインスタンスが返されることは、保証されません。
ブリッジ・メソッドやその他の特殊なケースが存在する可能性があるため、名前は同じだが記述子(戻り値やパラメータの型)が異なるような抽象メソッドが、インタフェース内にいくつか含まれることがあります。この場合、指定された1つのターゲットにすべてのメソッドが一緒にバインドされます。型チェックとasType
相当の変換が各メソッド型記述子に適用され、すべての抽象メソッドが共通のターゲットにバインドされます。この型チェックのほかには、抽象メソッドが何らかのかたちで関係していることを確認するためのチェックは一切行われません。
このAPIの将来のバージョンでは、単一の抽象メソッドを含む抽象クラスなど、追加の型を受け入れるようになる可能性があります。さらにこのAPIの将来のバージョンでは、1つ以上の追加のpublic「マーカー」インタフェースを持つラッパー・インスタンスが用意される可能性もあります。
セキュリティ・マネージャがインストールされている場合、このメソッドは呼出し元依存です。返されるラッパーを介してターゲット・メソッド・ハンドルの呼出し中、ラッパーの元の作成者(呼出し元)は、セキュリティ・マネージャによって要求されるコンテキスト・チェックに対して可視になります。
T
- ラッパーの期待される型、単一メソッド・インタフェースintfc
- T
を表すクラス・オブジェクトtarget
- ラッパーから呼び出すメソッド・ハンドルNullPointerException
- どちらかの引数がnullの場合IllegalArgumentException
- intfc
がこのメソッドの有効な引数でない場合WrongMethodTypeException
- 要求されたインタフェースで必要とされる型にターゲットを変換できない場合public static boolean isWrapperInstance(Object x)
asInterfaceInstance
への呼出しによって生成されたものかどうかを判定します。x
- 任意の参照asInterfaceInstance
によって生成されたオブジェクトを指している場合はtruepublic static MethodHandle wrapperInstanceTarget(Object x)
x
は、asInterfaceInstance
への呼出しによって生成されたものでなければいけません。この要件をテストするには、isWrapperInstance
を使用します。x
- 任意の参照IllegalArgumentException
- 参照xがラッパー・インスタンスに対するものでない場合public static Class<?> wrapperInstanceType(Object x)
x
は、asInterfaceInstance
への呼出しによって生成されたものでなければいけません。この要件をテストするには、isWrapperInstance
を使用します。x
- 任意の参照IllegalArgumentException
- 参照xがラッパー・インスタンスに対するものでない場合 バグまたは機能を送信
詳細なAPIリファレンスおよび開発者ドキュメントについては、Java SEのドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright© 1993, 2014, Oracle and/or its affiliates. All rights reserved.