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、クラス: Objectx - 比較するオブジェクトtrue、それ以外の場合はfalse。Object.equals(Object)public int hashCode()
hashCode、クラス: ObjectObject.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.