public final class MethodType extends Object implements Serializable
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
オブジェクトがはじめて派生されるまでの任意のタイミングで発生する可能性があります。
修飾子と型 | メソッドと説明 |
---|---|
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)
追加のパラメータの型を持つメソッド型を検索または作成します。
|
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, List<Class<?>> ptypes)
指定されたコンポーネントを持つメソッド型を検索または作成します。
|
static MethodType |
methodType(Class<?> rtype, MethodType 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()
すべてのプリミティブ型を対応するラッパー型に変換します。
|
public static MethodType methodType(Class<?> rtype, Class<?>[] ptypes)
rtype
- 戻り値の型ptypes
- パラメータの型NullPointerException
- rtype
またはptypes
がnullであるか、ptypes
のいずれかの要素がnullである場合IllegalArgumentException
- ptypes
のいずれかの要素がvoid.class
である場合public static MethodType methodType(Class<?> rtype, List<Class<?>> ptypes)
methodType
の簡易メソッド。rtype
- 戻り値の型ptypes
- パラメータの型NullPointerException
- rtype
またはptypes
がnullであるか、ptypes
のいずれかの要素がnullである場合IllegalArgumentException
- ptypes
のいずれかの要素がvoid.class
である場合public static MethodType methodType(Class<?> rtype, Class<?> ptype0, Class<?>... ptypes)
methodType
の簡易メソッド。先頭のパラメータの型が残りの配列の先頭に追加されます。rtype
- 戻り値の型ptype0
- 最初のパラメータ型ptypes
- 残りのパラメータ型NullPointerException
- rtype
、ptype0
、ptypes
のいずれかがnullであるか、ptypes
のいずれかの要素がnullである場合IllegalArgumentException
- ptype0
またはptypes
、あるいはptypes
のいずれかの要素がvoid.class
の場合public static MethodType methodType(Class<?> rtype)
methodType
の簡易メソッド。結果となるメソッドにはパラメータの型は含まれません。rtype
- 戻り値の型NullPointerException
- rtype
がnullである場合public static MethodType methodType(Class<?> rtype, Class<?> ptype0)
methodType
の簡易メソッド。結果となるメソッドには、指定された単一のパラメータの型が含まれます。rtype
- 戻り値の型ptype0
- パラメータ型NullPointerException
- rtype
またはptype0
がnullの場合IllegalArgumentException
- ptype0
がvoid.class
である場合public static MethodType methodType(Class<?> rtype, MethodType ptypes)
methodType
の簡易メソッド。結果となるメソッドには、ptypes
と同じパラメータの型と、指定された戻り値の型が含まれます。rtype
- 戻り値の型ptypes
- パラメータ型を提供するメソッド型NullPointerException
- rtype
またはptypes
がnullの場合public static MethodType genericMethodType(int objectArgCount, boolean finalArray)
Object
とオプションで末尾のObject[]
配列をコンポーネントに持つメソッド型を検索または作成します。methodType
の簡易メソッド。パラメータと戻り値の型はすべてObject
ですが、最後の配列パラメータが存在する場合はそのかぎりではなく、その型はObject[]
になります。objectArgCount
- パラメータの数(最後の配列パラメータが存在する場合、それは含まない)finalArray
- Object[]
型の末尾の配列パラメータが存在するかどうかIllegalArgumentException
- objectArgCount
が負であるか255 (finalArray
がtrueの場合は254)より大きい場合genericMethodType(int)
public static MethodType genericMethodType(int objectArgCount)
Object
であるようなメソッド型を検索または作成します。methodType
の簡易メソッド。パラメータの型と戻り値の型はすべてObjectです。objectArgCount
- パラメータの数IllegalArgumentException
- objectArgCount
が負であるか255より大きい場合genericMethodType(int, boolean)
public MethodType changeParameterType(int num, Class<?> nptype)
methodType
の簡易メソッド。num
- 変更するパラメータ型の(ゼロから始まる)インデックスnptype
- 古いパラメータの型を置き換える新しいパラメータの型IndexOutOfBoundsException
- num
がparameterArray()
の有効なインデックスでない場合IllegalArgumentException
- nptype
がvoid.class
である場合NullPointerException
- nptype
がnullである場合public MethodType insertParameterTypes(int num, Class<?>... ptypesToInsert)
methodType
の簡易メソッド。num
- 挿入するパラメータの型の(ゼロから始まる)位置ptypesToInsert
- パラメータ・リスト内に挿入するゼロ個以上の新しいパラメータの型IndexOutOfBoundsException
- num
が負であるかparameterCount()
より大きい場合IllegalArgumentException
- ptypesToInsert
のいずれかの要素がvoid.class
である場合、または結果となるメソッド型のパラメータ・スロット数が255個を超える場合NullPointerException
- ptypesToInsert
またはそのいずれかの要素がnullの場合public MethodType appendParameterTypes(Class<?>... ptypesToInsert)
methodType
の簡易メソッド。ptypesToInsert
- パラメータ・リストの末尾のあとに挿入するゼロ個以上の新しいパラメータの型IllegalArgumentException
- ptypesToInsert
のいずれかの要素がvoid.class
である場合、または結果となるメソッド型のパラメータ・スロット数が255個を超える場合NullPointerException
- ptypesToInsert
またはそのいずれかの要素がnullの場合public MethodType insertParameterTypes(int num, List<Class<?>> ptypesToInsert)
methodType
の簡易メソッド。num
- 挿入するパラメータの型の(ゼロから始まる)位置ptypesToInsert
- パラメータ・リスト内に挿入するゼロ個以上の新しいパラメータの型IndexOutOfBoundsException
- num
が負であるかparameterCount()
より大きい場合IllegalArgumentException
- ptypesToInsert
のいずれかの要素がvoid.class
である場合、または結果となるメソッド型のパラメータ・スロット数が255個を超える場合NullPointerException
- ptypesToInsert
またはそのいずれかの要素がnullの場合public MethodType appendParameterTypes(List<Class<?>> ptypesToInsert)
methodType
の簡易メソッド。ptypesToInsert
- パラメータ・リストの末尾のあとに挿入するゼロ個以上の新しいパラメータの型IllegalArgumentException
- ptypesToInsert
のいずれかの要素がvoid.class
である場合、または結果となるメソッド型のパラメータ・スロット数が255個を超える場合NullPointerException
- ptypesToInsert
またはそのいずれかの要素がnullの場合public MethodType dropParameterTypes(int start, int end)
methodType
の簡易メソッド。start
- 削除する最初のパラメータ型の(ゼロから始まる)インデックスend
- 削除しない最初のパラメータ型の(start
より大きい)インデックスIndexOutOfBoundsException
- start
が負であるかparameterCount()
より大きい場合、またはend
が負であるかparameterCount()
より大きい場合、またはstart
がend
より大きい場合public MethodType changeReturnType(Class<?> nrtype)
methodType
の簡易メソッド。nrtype
- 古い戻り値パラメータの型を置き換える戻り値パラメータの型NullPointerException
- nrtype
がnullである場合public boolean hasPrimitives()
void
はプリミティブとしてカウントされます。public boolean hasWrappers()
Integer
など)のことです。参照型java.lang.Void
が戻り値の型として含まれている場合、それはラッパーとしてカウントされます。public MethodType erase()
public MethodType generic()
Object
に変換します。genericMethodType
の簡易メソッド。式type.wrap().erase()
はtype.generic()
と同じ値を生成します。public MethodType wrap()
methodType
の簡易メソッド。参照型(ラッパー型も含む)はすべて変更されずに残ります。戻り値の型void
は型java.lang.Void
に変更されます。式type.wrap().erase()
はtype.generic()
と同じ値を生成します。public MethodType unwrap()
methodType
の簡易メソッド。すべてのプリミティブ型(void
を含む)は変更されないまま残ります。戻り値の型java.lang.Void
はvoid
に変更されます。public Class<?> parameterType(int num)
num
- 目的とするパラメータの型の(ゼロから始まる)インデックスIndexOutOfBoundsException
- num
がparameterArray()
の有効なインデックスでない場合public int parameterCount()
public Class<?> returnType()
public List<Class<?>> parameterList()
public Class<?>[] parameterArray()
public boolean equals(Object x)
equals
、クラス: Object
x
- 比較するオブジェクトtrue
、それ以外の場合はfalse
。Object.equals(Object)
public int hashCode()
hashCode
、クラス: Object
Object.hashCode()
, equals(Object)
, List.hashCode()
public String toString()
"(PT0,PT1...)RT"
の形式で返します。メソッド型の文字列表現は、型名のカンマ区切りリストをカッコで囲んだものの直後に、戻り値の型を付加したものになります。
各型は単純名
で表現されます。
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
- 指定された型を見つけられない場合public String toMethodDescriptorString()
これは厳密には、fromMethodDescriptorString
の逆の操作ではありません。共通の名前を共有しているが異なるクラス・ローダーを持つ異なる2つのクラスは、記述子文字列内では同一のものと見なされます。
このメソッドは、メソッド・ハンドルやinvokedynamic
を処理するバイト・コードを生成する必要があるアプリケーションのために含まれています。fromMethodDescriptorString
、後者は適切なクラス・ローダー引数を必要とするためです。
バグまたは機能を送信
詳細なAPIリファレンスおよび開発者ドキュメントについては、Java SEのドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright© 1993, 2014, Oracle and/or its affiliates. All rights reserved.