- java.lang.Object
-
- java.lang.invoke.MethodType
-
- すべての実装されたインタフェース:
Serializable
public final class MethodType extends Object implements Serializable
メソッド型は、メソッド・ハンドルが受け取ったり返したりする引数や戻り値の型、あるいはメソッド・ハンドルの呼出し元が渡したり期待したりする引数や戻り値の型を表します。 メソッド・ハンドルとそのすべての呼出し元との間でメソッド型が正しく一致する必要がありますが、JVMの操作はこの一致処理を、実行時に、具体的にはMethodHandle.invokeExactやMethodHandle.invokeの呼出し中およびinvokedynamic命令の実行中に、実施します。その構造は、戻り値の型に任意の数のパラメータの型を付加したものとなります。 型(プリミティブ、
void、および参照)はClassオブジェクトで表されます。 (説明が容易になるように、ここではvoidを型として扱います。 これは実際には、戻り値の型が存在しないことを示します。)MethodTypeのすべてのインスタンスは不変です。 2つのインスタンスを比較して等しくなった場合、両者は完全に交換可能です。 等しいかどうかは、戻り値とパラメータの型のペア単位の対応関係に依存し、それ以外の要素には一切依存しません。この型を作成できるのは、ファクトリ・メソッドだけです。 すべてのファクトリ・メソッドは値をキャッシングする可能性がありますが、キャッシングが実行されるという保証はありません。 ファクトリ・メソッドの中には、静的なメソッドもあれば、(選択されたパラメータを変更するなどして)既存のメソッド型を変更する仮想メソッドもあります。
一連のパラメータの型を操作するファクトリ・メソッドには体系的に2つのバージョンが用意されていますが、これは、一連のパラメータの型をJavaの配列とJavaのリストの両方で操作できるようにするためです。 クエリー・メソッド
parameterArrayとparameterListも、配列とリストの選択肢を提供しています。MethodTypeオブジェクトがinvokedynamicなどのバイト・コード命令から、具体的には、クラス・ファイルの定数プール内の命令に関連付けられた型記述子文字列から派生されることがあります。メソッド型はクラスや文字列の場合と同じく、クラス・ファイルの定数プール内の定数として直接表現することもできます。 メソッド型は、適切な
CONSTANT_MethodType定数プール・エントリを参照するldc命令によってロードできます。 そのエントリは、記述子文字列のCONSTANT_Utf8スペリングを参照します。 (メソッド型定数の詳細は、『Java Virtual Machine Specification』のセクション4.4.8および5.4.3.5を参照してください。)JVMが記述子文字列から
MethodTypeを実体化するときは、記述子で指定されたすべてのクラスはアクセス可能である必要があり、それらはすべてロードされます。 (ただしCONSTANT_Classの場合と同じく、クラスの初期化は不要です。) このロード処理は、MethodTypeオブジェクトがはじめて派生されるまでの任意のタイミングで発生する可能性があります。- 導入されたバージョン:
- 1.7
- 関連項目:
- 直列化された形式
-
-
メソッドのサマリー
すべてのメソッド staticメソッド インスタンス・メソッド 具象メソッド 修飾子と型 メソッド 説明 MethodTypeappendParameterTypes(Class<?>... ptypesToInsert)追加のパラメータの型を持つメソッド型を検索または作成します。MethodTypeappendParameterTypes(List<Class<?>> ptypesToInsert)追加のパラメータの型を持つメソッド型を検索または作成します。MethodTypechangeParameterType(int num, Class<?> nptype)1つのパラメータの型が異なるメソッド型を検索または作成します。MethodTypechangeReturnType(Class<?> nrtype)戻り値の型が異なるメソッド型を検索または作成します。MethodTypedropParameterTypes(int start, int end)いくつかのパラメータの型が削除されたメソッド型を検索または作成します。booleanequals(Object x)指定されたオブジェクトがこの型と等しいかどうかを比較します。MethodTypeerase()すべての参照型を消去してObjectにします。static MethodTypefromMethodDescriptorString(String descriptor, ClassLoader loader)バイト・コード記述子のスペリングに基づいてメソッド型のインスタンスを検索または作成します。MethodTypegeneric()すべての型(参照とプリミティブの両方)をObjectに変換します。static MethodTypegenericMethodType(int objectArgCount)コンポーネントがすべてObjectであるようなメソッド型を検索または作成します。static MethodTypegenericMethodType(int objectArgCount, boolean finalArray)Objectとオプションで末尾のObject[]配列をコンポーネントに持つメソッド型を検索または作成します。inthashCode()このメソッド型のハッシュ・コード値を返します。booleanhasPrimitives()この型にプリミティブの引数または戻り値が含まれているかどうかを報告します。booleanhasWrappers()この型にラッパーの引数または戻り値が含まれているかどうかを報告します。MethodTypeinsertParameterTypes(int num, Class<?>... ptypesToInsert)追加のパラメータの型を持つメソッド型を検索または作成します。MethodTypeinsertParameterTypes(int num, List<Class<?>> ptypesToInsert)追加のパラメータの型を持つメソッド型を検索または作成します。Class<?>lastParameterType()このメソッド・タイプの最後のパラメータ・タイプを返します。static MethodTypemethodType(Class<?> rtype)指定されたコンポーネントを持つメソッド型を検索または作成します。static MethodTypemethodType(Class<?> rtype, Class<?> ptype0)指定されたコンポーネントを持つメソッド型を検索または作成します。static MethodTypemethodType(Class<?> rtype, Class<?>[] ptypes)指定されたメソッド型のインスタンスを検索または作成します。static MethodTypemethodType(Class<?> rtype, Class<?> ptype0, Class<?>... ptypes)指定されたコンポーネントを持つメソッド型を検索または作成します。static MethodTypemethodType(Class<?> rtype, MethodType ptypes)指定されたコンポーネントを持つメソッド型を検索または作成します。static MethodTypemethodType(Class<?> rtype, List<Class<?>> ptypes)指定されたコンポーネントを持つメソッド型を検索または作成します。Class<?>[]parameterArray()パラメータの型を配列として提供します(簡易メソッド)。intparameterCount()このメソッド型に含まれるパラメータの型の数を返します。List<Class<?>>parameterList()パラメータの型をリストとして提供します(簡易メソッド)。Class<?>parameterType(int num)このメソッド型の中の指定されたインデックスのパラメータの型を返します。Class<?>returnType()このメソッド型の戻り値の型を返します。StringtoMethodDescriptorString()メソッド型のバイト・コード記述子表現を生成します。StringtoString()メソッド型の文字列表現を"(PT0,PT1...)RT"の形式で返します。MethodTypeunwrap()すべてのラッパー型を対応するプリミティブ型に変換します。MethodTypewrap()すべてのプリミティブ型を対応するラッパー型に変換します。
-
-
-
メソッドの詳細
-
methodType
public static MethodType methodType(Class<?> rtype, Class<?>[] ptypes)
指定されたメソッド型のインスタンスを検索または作成します。- パラメータ:
rtype- 戻り値の型ptypes- パラメータの型- 戻り値:
- 指定されたコンポーネントを持つメソッド型
- 例外:
NullPointerException-rtypeまたはptypesがnullであるか、ptypesのいずれかの要素がnullである場合IllegalArgumentException-ptypesのいずれかの要素がvoid.classである場合
-
methodType
public static MethodType methodType(Class<?> rtype, List<Class<?>> ptypes)
指定されたコンポーネントを持つメソッド型を検索または作成します。methodTypeの簡易メソッド。- パラメータ:
rtype- 戻り値の型ptypes- パラメータの型- 戻り値:
- 指定されたコンポーネントを持つメソッド型
- 例外:
NullPointerException-rtypeまたはptypesがnullであるか、ptypesのいずれかの要素がnullである場合IllegalArgumentException-ptypesのいずれかの要素がvoid.classである場合
-
methodType
public static MethodType methodType(Class<?> rtype, Class<?> ptype0, Class<?>... ptypes)
- パラメータ:
rtype- 戻り値の型ptype0- 最初のパラメータ型ptypes- 残りのパラメータ型- 戻り値:
- 指定されたコンポーネントを持つメソッド型
- 例外:
NullPointerException-rtype、ptype0、ptypesのいずれかがnullであるか、ptypesのいずれかの要素がnullである場合IllegalArgumentException-ptype0またはptypes、あるいはptypesのいずれかの要素がvoid.classの場合
-
methodType
public static MethodType methodType(Class<?> rtype)
- パラメータ:
rtype- 戻り値の型- 戻り値:
- 指定された戻り値を含むメソッド型
- 例外:
NullPointerException-rtypeがnullである場合
-
methodType
public static MethodType methodType(Class<?> rtype, Class<?> ptype0)
- パラメータ:
rtype- 戻り値の型ptype0- パラメータ型- 戻り値:
- 指定された戻り値とパラメータの型を持つメソッド型
- 例外:
NullPointerException-rtypeまたはptype0がnullの場合IllegalArgumentException-ptype0がvoid.classである場合
-
methodType
public static MethodType methodType(Class<?> rtype, MethodType ptypes)
- パラメータ:
rtype- 戻り値の型ptypes- パラメータ型を提供するメソッド型- 戻り値:
- 指定されたコンポーネントを持つメソッド型
- 例外:
NullPointerException-rtypeまたはptypesがnullの場合
-
genericMethodType
public static MethodType genericMethodType(int objectArgCount, boolean finalArray)
Objectとオプションで末尾のObject[]配列をコンポーネントに持つメソッド型を検索または作成します。methodTypeの簡易メソッド。 パラメータと戻り値の型はすべてObjectですが、最後の配列パラメータが存在する場合はそのかぎりではなく、その型はObject[]になります。- パラメータ:
objectArgCount- パラメータの数(最後の配列パラメータが存在する場合、それは含まない)finalArray-Object[]型の末尾の配列パラメータが存在するかどうか- 戻り値:
- 指定された固定数の引数と、追加の引数が集められた1つの配列が渡されるすべての呼出しに対し、汎用的に適用可能なメソッド型
- 例外:
IllegalArgumentException-objectArgCountが負であるか255 (finalArrayがtrueの場合は254)より大きい場合- 関連項目:
genericMethodType(int)
-
genericMethodType
public static MethodType genericMethodType(int objectArgCount)
- パラメータ:
objectArgCount- パラメータの数- 戻り値:
- 指定された数の引数が渡されるすべての呼出しに対し、汎用的に適用可能なメソッド型
- 例外:
IllegalArgumentException-objectArgCountが負であるか255より大きい場合- 関連項目:
genericMethodType(int, boolean)
-
changeParameterType
public MethodType changeParameterType(int num, Class<?> nptype)
1つのパラメータの型が異なるメソッド型を検索または作成します。methodTypeの簡易メソッド。- パラメータ:
num- 変更するパラメータ型の(ゼロから始まる)インデックスnptype- 古いパラメータの型を置き換える新しいパラメータの型- 戻り値:
- 同じ型、ただし選択されたパラメータを変更したもの
- 例外:
IndexOutOfBoundsException-numがparameterArray()の有効なインデックスでない場合IllegalArgumentException-nptypeがvoid.classである場合NullPointerException-nptypeがnullである場合
-
insertParameterTypes
public MethodType insertParameterTypes(int num, Class<?>... ptypesToInsert)
追加のパラメータの型を持つメソッド型を検索または作成します。methodTypeの簡易メソッド。- パラメータ:
num- 挿入するパラメータの型の(ゼロから始まる)位置ptypesToInsert- パラメータ・リスト内に挿入するゼロ個以上の新しいパラメータの型- 戻り値:
- 同じ型、ただし選択されたパラメータを挿入したもの
- 例外:
IndexOutOfBoundsException-numが負であるかparameterCount()より大きい場合IllegalArgumentException-ptypesToInsertのいずれかの要素がvoid.classである場合、または結果となるメソッド型のパラメータ・スロット数が255個を超える場合NullPointerException-ptypesToInsertまたはそのいずれかの要素がnullの場合
-
appendParameterTypes
public MethodType appendParameterTypes(Class<?>... ptypesToInsert)
追加のパラメータの型を持つメソッド型を検索または作成します。methodTypeの簡易メソッド。- パラメータ:
ptypesToInsert- パラメータ・リストの末尾のあとに挿入するゼロ個以上の新しいパラメータの型- 戻り値:
- 同じ型、ただしその末尾に選択されたパラメータを追加したもの
- 例外:
IllegalArgumentException-ptypesToInsertのいずれかの要素がvoid.classである場合、または結果となるメソッド型のパラメータ・スロット数が255個を超える場合NullPointerException-ptypesToInsertまたはそのいずれかの要素がnullの場合
-
insertParameterTypes
public MethodType insertParameterTypes(int num, List<Class<?>> ptypesToInsert)
追加のパラメータの型を持つメソッド型を検索または作成します。methodTypeの簡易メソッド。- パラメータ:
num- 挿入するパラメータの型の(ゼロから始まる)位置ptypesToInsert- パラメータ・リスト内に挿入するゼロ個以上の新しいパラメータの型- 戻り値:
- 同じ型、ただし選択されたパラメータを挿入したもの
- 例外:
IndexOutOfBoundsException-numが負であるかparameterCount()より大きい場合IllegalArgumentException-ptypesToInsertのいずれかの要素がvoid.classである場合、または結果となるメソッド型のパラメータ・スロット数が255個を超える場合NullPointerException-ptypesToInsertまたはそのいずれかの要素がnullの場合
-
appendParameterTypes
public MethodType appendParameterTypes(List<Class<?>> ptypesToInsert)
追加のパラメータの型を持つメソッド型を検索または作成します。methodTypeの簡易メソッド。- パラメータ:
ptypesToInsert- パラメータ・リストの末尾のあとに挿入するゼロ個以上の新しいパラメータの型- 戻り値:
- 同じ型、ただしその末尾に選択されたパラメータを追加したもの
- 例外:
IllegalArgumentException-ptypesToInsertのいずれかの要素がvoid.classである場合、または結果となるメソッド型のパラメータ・スロット数が255個を超える場合NullPointerException-ptypesToInsertまたはそのいずれかの要素がnullの場合
-
dropParameterTypes
public MethodType dropParameterTypes(int start, int end)
いくつかのパラメータの型が削除されたメソッド型を検索または作成します。methodTypeの簡易メソッド。- パラメータ:
start- 削除する最初のパラメータ型の(ゼロから始まる)インデックスend- 削除しない最初のパラメータ型の(startより大きい)インデックス- 戻り値:
- 同じ型、ただし選択されたパラメータを削除したもの
- 例外:
IndexOutOfBoundsException-startが負であるかparameterCount()より大きい場合、またはendが負であるかparameterCount()より大きい場合、またはstartがendより大きい場合
-
changeReturnType
public MethodType changeReturnType(Class<?> nrtype)
戻り値の型が異なるメソッド型を検索または作成します。methodTypeの簡易メソッド。- パラメータ:
nrtype- 古い戻り値パラメータの型を置き換える戻り値パラメータの型- 戻り値:
- 同じ型、ただし戻り値の型を変更したもの
- 例外:
NullPointerException-nrtypeがnullである場合
-
hasPrimitives
public boolean hasPrimitives()
この型にプリミティブの引数または戻り値が含まれているかどうかを報告します。 戻り値の型voidはプリミティブとしてカウントされます。- 戻り値:
- いずれかの型がプリミティブの場合はtrue
-
hasWrappers
public boolean hasWrappers()
この型にラッパーの引数または戻り値が含まれているかどうかを報告します。 ラッパーとは、プリミティブ値をボクシングした型(Integerなど)のことです。 参照型java.lang.Voidが戻り値の型として含まれている場合、それはラッパーとしてカウントされます。- 戻り値:
- いずれかの型がラッパーの場合はtrue
-
erase
public MethodType erase()
- 戻り値:
- 元の型のすべての参照型を置き換えたバージョン
-
generic
public MethodType generic()
すべての型(参照とプリミティブの両方)をObjectに変換します。genericMethodTypeの簡易メソッド。 式type.wrap().erase()はtype.generic()と同じ値を生成します。- 戻り値:
- 元の型のすべての型を置き換えたバージョン
-
wrap
public MethodType wrap()
すべてのプリミティブ型を対応するラッパー型に変換します。methodTypeの簡易メソッド。 参照型(ラッパー型も含む)はすべて変更されずに残ります。 戻り値の型voidは型java.lang.Voidに変更されます。 式type.wrap().erase()はtype.generic()と同じ値を生成します。- 戻り値:
- 元の型のすべてのプリミティブ型を置き換えたバージョン
-
unwrap
public MethodType unwrap()
すべてのラッパー型を対応するプリミティブ型に変換します。methodTypeの簡易メソッド。 すべてのプリミティブ型(voidを含む)は変更されないまま残ります。 戻り値の型java.lang.Voidはvoidに変更されます。- 戻り値:
- 元の型のすべてのラッパー型を置き換えたバージョン
-
parameterType
public Class<?> parameterType(int num)
このメソッド型の中の指定されたインデックスのパラメータの型を返します。- パラメータ:
num- 目的とするパラメータの型の(ゼロから始まる)インデックス- 戻り値:
- 選択されたパラメータの型
- 例外:
IndexOutOfBoundsException-numがparameterArray()の有効なインデックスでない場合
-
parameterCount
public int parameterCount()
このメソッド型に含まれるパラメータの型の数を返します。- 戻り値:
- パラメータの型の数
-
returnType
public Class<?> returnType()
このメソッド型の戻り値の型を返します。- 戻り値:
- 戻り値の型
-
parameterList
public List<Class<?>> parameterList()
パラメータの型をリストとして提供します(簡易メソッド)。 このリストは不変です。- 戻り値:
- パラメータの型(不変リストとして)
-
lastParameterType
public Class<?> lastParameterType()
このメソッド・タイプの最後のパラメータ・タイプを返します。 この型にパラメータがない場合、センチネル値void.classがかわりに返されます。- APIのノート:
結果値に対してリフレクティブ問合せを直接実行できるように、センチネル値が選択されます。
voidはパラメータ型として受け入れられないため、センチネル値は実パラメータと混同できません。 可変引数の起動モードの場合、式lastParameterType().getComponentType()は、varargsパラメータの型を問い合せる場合に役立ちます。- 戻り値:
- 最後のパラメータ・タイプ(存在する場合)、それ以外の場合は
void.class - 導入されたバージョン:
- 10
-
parameterArray
public Class<?>[] parameterArray()
パラメータの型を配列として提供します(簡易メソッド)。 この配列を変更しても、型は変更されません。- 戻り値:
- パラメータの型(必要な場合は新規のコピーとして)
-
equals
public boolean equals(Object x)
指定されたオブジェクトがこの型と等しいかどうかを比較します。 つまり、その戻り値がtrueになるのは、指定されたオブジェクトもまた、まったく同じパラメータと戻り値の型を持つメソッド型である場合だけです。- オーバーライド:
equals、クラスObject- パラメータ:
x- 比較するオブジェクト- 戻り値:
- このオブジェクトがobj引数と同じである場合は
true、それ以外の場合はfalse。 - 関連項目:
Object.equals(Object)
-
hashCode
public int hashCode()
このメソッド型のハッシュ・コード値を返します。 要素として戻り値の型のあとにパラメータの型を持つようなListのハッシュ・コードと同じであると定義されています。- オーバーライド:
hashCode、クラスObject- 戻り値:
- このメソッド型のハッシュ・コード値
- 関連項目:
Object.hashCode(),equals(Object),List.hashCode()
-
toString
public String toString()
メソッド型の文字列表現を"(PT0,PT1...)RT"の形式で返します。 メソッド型の文字列表現は、型名のカンマ区切りリストをカッコで囲んだものの直後に、戻り値の型を付加したものになります。各型は
単純名で表現されます。
-
fromMethodDescriptorString
public static MethodType fromMethodDescriptorString(String descriptor, ClassLoader loader) throws IllegalArgumentException, TypeNotPresentException
バイト・コード記述子のスペリングに基づいてメソッド型のインスタンスを検索または作成します。methodTypeの簡易メソッド。 記述子文字列に埋め込まれたすべてのクラス名またはインタフェース名を解決するため、指定されたローダー(それがnullの場合はシステム・クラス・ローダー)のClassLoader.loadClass(java.lang.String)が呼び出されます。一般的なクラス・ローダーからすべてのコンポーネントの型に必ずしも到達できないため、このメソッドでは構築できないメソッド型に遭遇する可能性があります。
このメソッドは、メソッド・ハンドルや
invokedynamicを処理するバイト・コードを生成する必要があるアプリケーションのために含まれています。- パラメータ:
descriptor- バイトコードレベルの型記述子の文字列「(T...)T」loader- 型の検索先となるクラス・ローダー- 戻り値:
- バイトコードレベルの型記述子に一致するメソッド型
- 例外:
NullPointerException- 文字列がnullの場合IllegalArgumentException- 文字列が整形式でない場合TypeNotPresentException- 指定された型を見つけられない場合
-
toMethodDescriptorString
public String toMethodDescriptorString()
メソッド型のバイト・コード記述子表現を生成します。これは厳密には、
fromMethodDescriptorStringの逆の操作ではありません。 共通の名前を共有しているが異なるクラス・ローダーを持つ異なる2つのクラスは、記述子文字列内では同一のものと見なされます。このメソッドは、メソッド・ハンドルや
invokedynamicを処理するバイト・コードを生成する必要があるアプリケーションのために含まれています。fromMethodDescriptorString、後者は適切なクラス・ローダー引数を必要とするためです。- 戻り値:
- バイト・コードの型記述子の表現
-
-