クラスMethodHandleProxies
- 導入されたバージョン:
- 1.7
-
メソッドのサマリー
修飾子と型メソッド説明static <T> TasInterfaceInstance(Class<T> intfc, MethodHandle target) 指定されたメソッド・ハンドルに呼出しをリダイレクトする、指定された単一メソッド・インタフェースのインスタンスを生成します。static boolean指定されたオブジェクトが、asInterfaceInstanceへの呼出しによって生成されたものかどうかを判定します。static MethodHandleこのラッパー・インスタンスの一意のメソッドと動作が同等であるターゲット・メソッド・ハンドルを生成または回復します。static Class<?> このラッパー・インスタンスが作成されたときの一意の単一メソッド・インタフェースの型を回復します。
-
メソッドの詳細
-
asInterfaceInstance
public static <T> T asInterfaceInstance(Class<T> intfc, MethodHandle target) 指定されたメソッド・ハンドルに呼出しをリダイレクトする、指定された単一メソッド・インタフェースのインスタンスを生成します。単一メソッド・インタフェースとは、一意の名前を持つメソッドが宣言されたインタフェースのことです。 シングル・メソッド・インタフェースの一意の名前付きメソッドを特定するときは、デフォルトの(non-abstract)メソッドと同じように、public
Objectメソッド(toString,equals,hashCode)は無視されます。 たとえば、Comparatorは、Object.equalsメソッドを再宣言し、Comparator.reverseなどのデフォルトのメソッドも宣言している場合でも、単一メソッドのインタフェースです。インタフェースは、sealedではなく、hiddenではなく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- 要求されたインタフェースで必要とされる型にターゲットを変換できない場合
-
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
このラッパー・インスタンスが作成されたときの一意の単一メソッド・インタフェースの型を回復します。 オブジェクトxは、asInterfaceInstanceへの呼出しによって生成されたものでなければいけません。 この要件をテストするには、isWrapperInstanceを使用します。- パラメータ:
x- 任意の参照- 戻り値:
- ラッパーが作成されたときの単一メソッド・インタフェースの型
- スロー:
IllegalArgumentException- 参照xがラッパー・インスタンスに対するものでない場合
-