- 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メソッド インスタンス・メソッド 具象メソッド 修飾子と型 メソッド 説明 MethodType
appendParameterTypes(Class<?>... ptypesToInsert)
追加のパラメータの型を持つメソッド型を検索または作成します。MethodType
appendParameterTypes(List<Class<?>> ptypesToInsert)
追加のパラメータの型を持つメソッド型を検索または作成します。MethodType
changeParameterType(int num, Class<?> nptype)
1つのパラメータの型が異なるメソッド型を検索または作成します。MethodType
changeReturnType(Class<?> nrtype)
戻り値の型が異なるメソッド型を検索または作成します。MethodType
dropParameterTypes(int start, int end)
いくつかのパラメータの型が削除されたメソッド型を検索または作成します。boolean
equals(Object x)
指定されたオブジェクトがこの型と等しいかどうかを比較します。MethodType
erase()
すべての参照型を消去してObject
にします。static MethodType
fromMethodDescriptorString(String descriptor, ClassLoader loader)
バイト・コード記述子のスペリングに基づいてメソッド型のインスタンスを検索または作成します。MethodType
generic()
すべての型(参照とプリミティブの両方)をObject
に変換します。static MethodType
genericMethodType(int objectArgCount)
コンポーネントがすべてObject
であるようなメソッド型を検索または作成します。static MethodType
genericMethodType(int objectArgCount, boolean finalArray)
Object
とオプションで末尾のObject[]
配列をコンポーネントに持つメソッド型を検索または作成します。int
hashCode()
このメソッド型のハッシュ・コード値を返します。boolean
hasPrimitives()
この型にプリミティブの引数または戻り値が含まれているかどうかを報告します。boolean
hasWrappers()
この型にラッパーの引数または戻り値が含まれているかどうかを報告します。MethodType
insertParameterTypes(int num, Class<?>... ptypesToInsert)
追加のパラメータの型を持つメソッド型を検索または作成します。MethodType
insertParameterTypes(int num, List<Class<?>> ptypesToInsert)
追加のパラメータの型を持つメソッド型を検索または作成します。Class<?>
lastParameterType()
このメソッド型の最後のパラメータ型を返します。static MethodType
methodType(Class<?> rtype)
指定されたコンポーネントを持つメソッド型を検索または作成します。static MethodType
methodType(Class<?> rtype, Class<?> ptype0)
指定されたコンポーネントを持つメソッド型を検索または作成します。static MethodType
methodType(Class<?> rtype, Class<?>[] ptypes)
指定されたメソッド型のインスタンスを検索または作成します。static MethodType
methodType(Class<?> rtype, Class<?> ptype0, Class<?>... ptypes)
指定されたコンポーネントを持つメソッド型を検索または作成します。static MethodType
methodType(Class<?> rtype, MethodType ptypes)
指定されたコンポーネントを持つメソッド型を検索または作成します。static MethodType
methodType(Class<?> rtype, List<Class<?>> ptypes)
指定されたコンポーネントを持つメソッド型を検索または作成します。Class<?>[]
parameterArray()
パラメータの型を配列として提供します(簡易メソッド)。int
parameterCount()
このメソッド型に含まれるパラメータの型の数を返します。List<Class<?>>
parameterList()
パラメータの型をリストとして提供します(簡易メソッド)。Class<?>
parameterType(int num)
このメソッド型の中の指定されたインデックスのパラメータの型を返します。Class<?>
returnType()
このメソッド型の戻り値の型を返します。String
toMethodDescriptorString()
メソッド型のバイト・コード記述子表現を生成します。String
toString()
メソッド型の文字列表現を"(PT0,PT1...)RT"
の形式で返します。MethodType
unwrap()
すべてのラッパー型を対応するプリミティブ型に変換します。MethodType
wrap()
すべてのプリミティブ型を対応するラッパー型に変換します。
-
-
-
メソッドの詳細
-
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
、後者は適切なクラス・ローダー引数を必要とするためです。- 戻り値:
- バイト・コードの型記述子の表現
-
-