public class MethodHandleProxies extends Object
- 導入されたバージョン:
- 1.7
-
メソッドのサマリー
修飾子と型 メソッド 説明 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)
このラッパー・インスタンスが作成されたときの一意の単一メソッド・インタフェースの型を回復します。
-
メソッドの詳細
-
asInterfaceInstance
public static <T> T asInterfaceInstance(Class<T> intfc, MethodHandle target)指定されたメソッド・ハンドルに呼出しをリダイレクトする、指定された単一メソッド・インタフェースのインスタンスを生成します。単一メソッド・インタフェースとは、一意の名前を持つメソッドが宣言されたインタフェースのことです。 シングル・メソッド・インタフェースの一意の名前付きメソッドを特定するときは、デフォルトの(non-abstract)メソッドと同じように、public
Object
メソッド(toString
,equals
,hashCode
)は無視されます。 たとえば、Comparator
は、Object.equals
メソッドを再宣言し、Comparator.reverse
などのデフォルトのメソッドも宣言している場合でも、単一メソッドのインタフェースです。インタフェースは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がラッパー・インスタンスに対するものでない場合
-