モジュール java.base
パッケージ java.lang.invoke

クラスMethodType

java.lang.Object
java.lang.invoke.MethodType
すべての実装されたインタフェース:
Serializable, Constable, TypeDescriptor, TypeDescriptor.OfMethod<Class<?>,MethodType>

public final class MethodType extends Object implements Constable, TypeDescriptor.OfMethod<Class<?>,MethodType>, Serializable
メソッド型は、メソッド・ハンドルが受け取ったり返したりする引数や戻り値の型、あるいはメソッド・ハンドルの呼出し元が渡したり期待したりする引数や戻り値の型を表します。 メソッド・ハンドルとそのすべての呼出し元との間でメソッド型が正しく一致する必要がありますが、JVMの操作はこの一致処理を、実行時に、具体的にはMethodHandle.invokeExactMethodHandle.invokeの呼出し中およびinvokedynamic命令の実行中に、実施します。

その構造は、戻り値の型に任意の数のパラメータの型を付加したものとなります。 型(プリミティブ、void、および参照)はClassオブジェクトで表されます。 (説明が容易になるように、ここではvoidを型として扱います。 これは実際には、戻り値の型が存在しないことを示します。)

MethodTypeのすべてのインスタンスは不変です。 2つのインスタンスを比較して等しくなった場合、両者は完全に交換可能です。 等しいかどうかは、戻り値とパラメータの型のペア単位の対応関係に依存し、それ以外の要素には一切依存しません。

この型を作成できるのは、ファクトリ・メソッドだけです。 すべてのファクトリ・メソッドは値をキャッシングする可能性がありますが、キャッシングが実行されるという保証はありません。 ファクトリ・メソッドの中には、静的なメソッドもあれば、(選択されたパラメータを変更するなどして)既存のメソッド型を変更する仮想メソッドもあります。

一連のパラメータの型を操作するファクトリ・メソッドには体系的に2つのバージョンが用意されていますが、これは、一連のパラメータの型をJavaの配列とJavaのリストの両方で操作できるようにするためです。 クエリー・メソッドparameterArrayparameterListも、配列とリストの選択肢を提供しています。

MethodTypeオブジェクトがinvokedynamicなどのバイト・コード命令から、具体的には、クラス・ファイルの定数プール内の命令に関連付けられた型記述子文字列から派生されることがあります。

メソッド型はクラスや文字列の場合と同じく、クラス・ファイルの定数プール内の定数として直接表現することもできます。 メソッド型は、適切なCONSTANT_MethodType定数プール・エントリを参照するldc命令によってロードできます。 そのエントリは、記述子文字列のCONSTANT_Utf8スペリングを参照します。 (メソッド・タイプ定数の詳細は、Java Virtual Machine仕様の4.4.8および5.4.3.5の項を参照してください。)

JVMが記述子文字列からMethodTypeを実体化するときは、記述子で指定されたすべてのクラスはアクセス可能である必要があり、それらはすべてロードされます。 (ただしCONSTANT_Classの場合と同じく、クラスの初期化は不要です。) このロード処理は、MethodTypeオブジェクトがはじめて派生されるまでの任意のタイミングで発生する可能性があります。

名目記述子

MethodTypeは、ClassDescで表されるnominal descriptorを使用してすべてのパラメータ型および戻り型を記述できる場合にのみ、「名目書式」で記述できます。 メソッド・タイプを名目的に記述できる場合は、次のようになります:

パラメータ型または戻り型のいずれかを名目的に記述できない場合、つまりClass::describeConstableがその型に対して空のオプションを返す場合、メソッド型を名目的に記述することはできません:

導入されたバージョン:
1.7
関連項目:
  • メソッドの詳細

    • 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)
      指定されたコンポーネントを持つメソッド型を検索または作成します。 methodTypeの簡易メソッド。 先頭のパラメータの型が残りの配列の先頭に追加されます。
      パラメータ:
      rtype - 戻り値の型
      ptype0 - 最初のパラメータ型
      ptypes - 残りのパラメータ型
      戻り値:
      指定されたコンポーネントを持つメソッド型
      例外:
      NullPointerException - rtypeptype0ptypesのいずれかがnullであるか、ptypesのいずれかの要素がnullである場合
      IllegalArgumentException - ptype0またはptypes、あるいはptypesのいずれかの要素がvoid.classの場合
    • methodType

      public static MethodType methodType(Class<?> rtype)
      指定されたコンポーネントを持つメソッド型を検索または作成します。 methodTypeの簡易メソッド。 結果となるメソッドにはパラメータの型は含まれません。
      パラメータ:
      rtype - 戻り値の型
      戻り値:
      指定された戻り値を含むメソッド型
      例外:
      NullPointerException - rtypeがnullである場合
    • methodType

      public static MethodType methodType(Class<?> rtype, Class<?> ptype0)
      指定されたコンポーネントを持つメソッド型を検索または作成します。 methodTypeの簡易メソッド。 結果となるメソッドには、指定された単一のパラメータの型が含まれます。
      パラメータ:
      rtype - 戻り値の型
      ptype0 - パラメータ型
      戻り値:
      指定された戻り値とパラメータの型を持つメソッド型
      例外:
      NullPointerException - rtypeまたはptype0がnullの場合
      IllegalArgumentException - ptype0void.classである場合
    • methodType

      public static MethodType methodType(Class<?> rtype, MethodType ptypes)
      指定されたコンポーネントを持つメソッド型を検索または作成します。 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

      public static MethodType genericMethodType(int objectArgCount)
      コンポーネントがすべてObjectであるようなメソッド型を検索または作成します。 methodTypeの簡易メソッド。 パラメータの型と戻り値の型はすべてObjectです。
      パラメータ:
      objectArgCount - パラメータの数
      戻り値:
      指定された数の引数が渡されるすべての呼出しに対し、汎用的に適用可能なメソッド型
      例外:
      IllegalArgumentException - objectArgCountが負であるか255より大きい場合
      関連項目:
    • changeParameterType

      public MethodType changeParameterType(int num, Class<?> nptype)
      1つのパラメータの型が異なるメソッド型を検索または作成します。 methodTypeの簡易メソッド。
      定義:
      インタフェースTypeDescriptor.OfMethod<Class<?>,MethodType>内のchangeParameterType
      パラメータ:
      num - 変更するパラメータ型の(ゼロから始まる)インデックス
      nptype - 古いパラメータの型を置き換える新しいパラメータの型
      戻り値:
      同じ型、ただし選択されたパラメータを変更したもの
      例外:
      IndexOutOfBoundsException - numparameterArray()の有効なインデックスでない場合
      IllegalArgumentException - nptypevoid.classである場合
      NullPointerException - nptypeがnullである場合
    • insertParameterTypes

      public MethodType insertParameterTypes(int num, Class<?>... ptypesToInsert)
      追加のパラメータの型を持つメソッド型を検索または作成します。 methodTypeの簡易メソッド。
      定義:
      インタフェースTypeDescriptor.OfMethod<Class<?>,MethodType>内のinsertParameterTypes
      パラメータ:
      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の簡易メソッド。
      定義:
      インタフェースTypeDescriptor.OfMethod<Class<?>,MethodType>内のdropParameterTypes
      パラメータ:
      start - 削除する最初のパラメータ型の(ゼロから始まる)インデックス
      end - 削除しない最初のパラメータ型の(startより大きい)インデックス
      戻り値:
      同じ型、ただし選択されたパラメータを削除したもの
      例外:
      IndexOutOfBoundsException - startが負であるかparameterCount()より大きい場合、またはendが負であるかparameterCount()より大きい場合、またはstartendより大きい場合
    • changeReturnType

      public MethodType changeReturnType(Class<?> nrtype)
      戻り値の型が異なるメソッド型を検索または作成します。 methodTypeの簡易メソッド。
      定義:
      インタフェースTypeDescriptor.OfMethod<Class<?>,MethodType>内のchangeReturnType
      パラメータ:
      nrtype - 古い戻り値パラメータの型を置き換える戻り値パラメータの型
      戻り値:
      同じ型、ただし戻り値の型を変更したもの
      例外:
      NullPointerException - nrtypeがnullである場合
    • hasPrimitives

      public boolean hasPrimitives()
      この型にプリミティブの引数または戻り値が含まれているかどうかを報告します。 戻り値の型voidはプリミティブとしてカウントされます。
      戻り値:
      いずれかの型がプリミティブの場合はtrue
    • hasWrappers

      public boolean hasWrappers()
      この型にラッパーの引数または戻り値が含まれているかどうかを報告します。 ラッパーとは、プリミティブ値をボクシングした型(Integerなど)のことです。 参照型java.lang.Voidが戻り値の型として含まれている場合、それはラッパーとしてカウントされます。
      戻り値:
      いずれかの型がラッパーの場合はtrue
    • erase

      public MethodType erase()
      すべての参照型を消去してObjectにします。 methodTypeの簡易メソッド。 すべてのプリミティブ型(voidを含む)は変更されないまま残ります。
      戻り値:
      元の型のすべての参照型を置き換えたバージョン
    • 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.Voidvoidに変更されます。
      戻り値:
      元の型のすべてのラッパー型を置き換えたバージョン
    • parameterType

      public Class<?> parameterType(int num)
      このメソッド型の中の指定されたインデックスのパラメータの型を返します。
      定義:
      インタフェースTypeDescriptor.OfMethod<Class<?>,MethodType>内のparameterType
      パラメータ:
      num - 目的とするパラメータの型の(ゼロから始まる)インデックス
      戻り値:
      選択されたパラメータの型
      例外:
      IndexOutOfBoundsException - numparameterArray()の有効なインデックスでない場合
    • parameterCount

      public int parameterCount()
      このメソッド型に含まれるパラメータの型の数を返します。
      定義:
      インタフェースTypeDescriptor.OfMethod<Class<?>,MethodType>内のparameterCount
      戻り値:
      パラメータの型の数
    • returnType

      public Class<?> returnType()
      このメソッド型の戻り値の型を返します。
      定義:
      インタフェースTypeDescriptor.OfMethod<Class<?>,MethodType>内のreturnType
      戻り値:
      戻り型
    • parameterList

      public List<Class<?>> parameterList()
      パラメータの型をリストとして提供します(簡易メソッド)。 このリストは不変です。
      定義:
      インタフェースTypeDescriptor.OfMethod<Class<?>,MethodType>内のparameterList
      戻り値:
      パラメータの型(不変リストとして)
    • lastParameterType

      public Class<?> lastParameterType()
      このメソッド型の最後のパラメータ型を返します。 このタイプにパラメータがない場合、代わりにセンチ・ネル値void.classが返されます。
      APIのノート:

      センチ・ネル値は、結果問合せ値に対して直接的に反映問合せを作成できるように選択されます。 voidはパラメータ型として受け入れられないので、センチ・ネル値と実際のパラメータを混同することはできません。 可変アリティ呼び出しモードの場合、式lastParameterType().getComponentType()は"varargs"パラメータのタイプを問合せするのに便利です。

      戻り値:
      最後のパラメータ型があれば、それ以外はvoid.class
      導入されたバージョン:
      10
    • parameterArray

      public Class<?>[] parameterArray()
      パラメータの型を配列として提供します(簡易メソッド)。 この配列を変更しても、型は変更されません。
      定義:
      インタフェースTypeDescriptor.OfMethod<Class<?>,MethodType>内のparameterArray
      戻り値:
      パラメータの型(必要な場合は新規のコピーとして)
    • equals

      public boolean equals(Object x)
      指定されたオブジェクトがこの型と等しいかどうかを比較します。 つまり、その戻り値がtrueになるのは、指定されたオブジェクトもまた、まったく同じパラメータと戻り値の型を持つメソッド型である場合だけです。
      オーバーライド:
      equals、クラスObject
      パラメータ:
      x - 比較するオブジェクト
      戻り値:
      このオブジェクトがobj引数と同じである場合はtrue、それ以外の場合はfalse
      関連項目:
    • hashCode

      public int hashCode()
      このメソッド型のハッシュ・コード値を返します。 要素として戻り値の型のあとにパラメータの型を持つようなListのハッシュ・コードと同じであると定義されています。
      オーバーライド:
      hashCode、クラスObject
      戻り値:
      このメソッド型のハッシュ・コード値
      関連項目:
    • toString

      public String toString()
      メソッド型の文字列表現を"(PT0,PT1...)RT"の形式で返します。 メソッド型の文字列表現は、型名のカンマ区切りリストをカッコで囲んだものの直後に、戻り値の型を付加したものになります。

      各型は単純名で表現されます。

      オーバーライド:
      toString、クラスObject
      戻り値:
      このオブジェクトの文字列表現
    • fromMethodDescriptorString

      public static MethodType fromMethodDescriptorString(String descriptor, ClassLoader loader) throws IllegalArgumentException, TypeNotPresentException
      バイト・コード記述子のスペリングに基づいてメソッド型のインスタンスを検索または作成します。 methodTypeの簡易メソッド。 記述子文字列に埋め込まれたクラス名またはインタフェース名は、指定されたローダー(または、nullの場合はシステム・クラス・ローダー。)によって解決されます。

      一般的なクラス・ローダーからすべてのコンポーネントの型に必ずしも到達できないため、このメソッドでは構築できないメソッド型に遭遇する可能性があります。

      このメソッドは、メソッド・ハンドルやinvokedynamicを処理するバイト・コードを生成する必要があるアプリケーションのために含まれています。

      パラメータ:
      descriptor - バイトコードレベルの型記述子の文字列「(T...)T」
      loader - 型の検索先となるクラス・ローダー
      戻り値:
      バイトコードレベルの型記述子に一致するメソッド型
      例外:
      NullPointerException - 文字列がnullの場合
      IllegalArgumentException - 文字列が整形式でない場合
      TypeNotPresentException - 指定された型を見つけられない場合
      SecurityException - セキュリティ・マネージャが存在し、loadernullで、コール元にRuntimePermission("getClassLoader")が含まれていない場合
    • toMethodDescriptorString

      public String toMethodDescriptorString()
      メソッド・タイプの記述子文字列を返します。 このメソッドは、MethodType::descriptorStringのコールと同等です。

      これは厳密には、fromMethodDescriptorStringの逆の操作ではありません。 共通の名前を共有しているが異なるクラス・ローダーを持つ異なる2つのクラスは、記述子文字列内では同一のものと見なされます。

      このメソッドは、メソッド・ハンドルやinvokedynamicを処理するバイト・コードを生成する必要があるアプリケーションのために含まれています。fromMethodDescriptorString、後者は適切なクラス・ローダー引数を必要とするためです。

      戻り値:
      このメソッド・タイプの記述子文字列
      Java Virtual Machine仕様を参照してください:
      4.3.3 メソッド記述子
      関連項目:
    • descriptorString

      public String descriptorString()
      このメソッド・タイプの記述子文字列を返します。

      このメソッド型が「名目的に記述」の場合、結果はメソッド型記述子(JVMS 4.3.3)になります。 このメソッド・タイプのMethodTypeDescは、結果記述子文字列を指定してMethodTypeDesc::ofDescriptorをコールすることで生成できます。

      このメソッド・タイプを「名目的に記述」にできず、結果が次の形式の文字列である場合:

      "(<parameter-descriptors>)<return-descriptor>"
      <parameter-descriptors>は、すべてのパラメータ型と戻り型の「記述子文字列」「記述子文字列」を連結したものです。 結果文字列からMethodTypeDescを生成できません。

      定義:
      インタフェースTypeDescriptor内のdescriptorString
      戻り値:
      このメソッド・タイプの記述子文字列
      Java Virtual Machine仕様を参照してください:
      4.3.3 メソッド記述子
      導入されたバージョン:
      12
      関連項目:
    • describeConstable

      public Optional<MethodTypeDesc> describeConstable()
      このインスタンスの名目記述子を返します(作成可能な場合)、作成できない場合は空のOptionalを返します。
      定義:
      インタフェースConstable内のdescribeConstable
      戻り値:
      最終的な名目記述子を含むOptional、または作成できない場合は空のOptional
      導入されたバージョン:
      12
      関連項目: