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「マーカー」インタフェースを持つラッパーインスタンスが用意される可能性もあります。
target
- ラッパーから呼び出すメソッドハンドルintfc
- ラッパーの目的とする型 (単一メソッドインタフェース)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, 2013, Oracle and/or its affiliates. All rights reserved.