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

クラスMethodType

java.lang.Object
java.lang.invoke.MethodType
すべての実装されたインタフェース:
Serializable, Constable, TypeDescriptor, TypeDescriptor.OfMethod<Class<?>,MethodType>

public final class MethodType extends Object implements Constable, TypeDescriptor.OfMethod<Class<?>,MethodType>, Serializable
メソッド型は、メソッド・ハンドルが受け取ったり返したりする引数や戻り値の型、あるいはメソッド・ハンドルの呼出し元が渡したり期待したりする引数や戻り値の型を表します。 メソッド・ハンドルとそのすべての呼出し元との間でメソッド型が正しく一致する必要がありますが、JVMの操作はこの一致処理を、実行時に、具体的にはMethodHandle.invokeExactMethodHandle.invokeの呼出し中およびinvokedynamic命令の実行中に、実施します。

その構造は、戻り値の型に任意の数のパラメータの型を付加したものとなります。 型(プリミティブ、void、および参照)はClassオブジェクトで表されます。 (説明が容易になるように、ここではvoidを型として扱います。 これは実際には、戻り値の型が存在しないことを示します。)

MethodTypeのすべてのインスタンスは不変です。 2つのインスタンスを比較して等しくなった場合、両者は完全に交換可能です。 等しいかどうかは、戻り値とパラメータの型のペア単位の対応関係に依存し、それ以外の要素には一切依存しません。

この型を作成できるのは、ファクトリ・メソッドだけです。 すべてのファクトリ・メソッドは値をキャッシングする可能性がありますが、キャッシングが実行されるという保証はありません。 ファクトリ・メソッドの中には、静的なメソッドもあれば、(選択されたパラメータを変更するなどして)既存のメソッド型を変更する仮想メソッドもあります。

一連のパラメータの型を操作するファクトリ・メソッドには体系的に2つのバージョンが用意されていますが、これは、一連のパラメータの型をJavaの配列とJavaのリストの両方で操作できるようにするためです。 クエリー・メソッドparameterArrayparameterListも、配列とリストの選択肢を提供しています。

MethodTypeオブジェクトがinvokedynamicなどのバイト・コード命令から、具体的には、クラス・ファイルの定数プール内の命令に関連付けられた型記述子文字列から派生されることがあります。

メソッド型はクラスや文字列の場合と同じく、クラス・ファイルの定数プール内の定数として直接表現することもできます。 メソッド型は、適切なCONSTANT_MethodType定数プール・エントリを参照するldc命令によってロードできます。 そのエントリは、記述子文字列のCONSTANT_Utf8スペリングを参照します。 (メソッド・タイプ定数の詳細は、Java Virtual Machine仕様の4.4.8および5.4.3.5の項を参照してください。)

JVMが記述子文字列からMethodTypeを実体化するときは、記述子で指定されたすべてのクラスはアクセス可能である必要があり、それらはすべてロードされます。 (ただしCONSTANT_Classの場合と同じく、クラスの初期化は不要です。) このロード処理は、MethodTypeオブジェクトがはじめて派生されるまでの任意のタイミングで発生する可能性があります。

名目記述子

MethodTypeは、ClassDescで表されるnominal descriptorを使用してすべてのパラメータ型および戻り型を記述できる場合にのみ、「名目書式」で記述できます。 メソッド・タイプを名目的に記述できる場合は、次のようになります:

パラメータ型または戻り型のいずれかを名目的に記述できない場合、つまりClass::describeConstableがその型に対して空のオプションを返す場合、メソッド型を名目的に記述することはできません:

導入されたバージョン:
1.7
関連項目: