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
スペリングを参照します。詳細は、パッケージのサマリーを参照してください。
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
の簡易メソッド。NullPointerException
- rtype
または ptypes
が null であるか、ptypes
のいずれかの要素が null である場合IllegalArgumentException
- ptypes
のいずれかの要素が void.class
である場合public static MethodType methodType(Class<?> rtype, Class<?> ptype0, Class<?>... ptypes)
methodType
の簡易メソッド。先頭のパラメータの型が残りの配列の先頭に追加されます。NullPointerException
- rtype
、ptype0
、ptypes
のいずれかが null であるか、ptypes
のいずれかの要素が null である場合IllegalArgumentException
- ptype0
または ptypes
、あるいは ptypes
のいずれかの要素が void.class
の場合public static MethodType methodType(Class<?> rtype)
methodType
の簡易メソッド。結果となるメソッドにはパラメータの型は含まれません。NullPointerException
- rtype
が null である場合public static MethodType methodType(Class<?> rtype, Class<?> ptype0)
methodType
の簡易メソッド。結果となるメソッドには、指定された単一のパラメータの型が含まれます。NullPointerException
- rtype
または ptype0
が null の場合IllegalArgumentException
- ptype0
が void.class
である場合public static MethodType methodType(Class<?> rtype, MethodType ptypes)
methodType
の簡易メソッド。結果となるメソッドには、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, 2013, Oracle and/or its affiliates. All rights reserved.