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

クラスMethodType

  • すべての実装されたインタフェース:
    Serializable

    public final class MethodType
    extends Object
    implements 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 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)
        指定されたコンポーネントを持つメソッド型を検索または作成します。 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(int)
      • genericMethodType

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

        public MethodType changeParameterType​(int num,
                                              Class<?> nptype)
        1つのパラメータの型が異なるメソッド型を検索または作成します。 methodTypeの簡易メソッド。
        パラメータ:
        num - 変更するパラメータ型の(ゼロから始まる)インデックス
        nptype - 古いパラメータの型を置き換える新しいパラメータの型
        戻り値:
        同じ型、ただし選択されたパラメータを変更したもの
        例外:
        IndexOutOfBoundsException - numparameterArray()の有効なインデックスでない場合
        IllegalArgumentException - nptypevoid.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()より大きい場合、またはstartendより大きい場合
      • 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()
        すべての参照型を消去して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)
        このメソッド型の中の指定されたインデックスのパラメータの型を返します。
        パラメータ:
        num - 目的とするパラメータの型の(ゼロから始まる)インデックス
        戻り値:
        選択されたパラメータの型
        例外:
        IndexOutOfBoundsException - numparameterArray()の有効なインデックスでない場合
      • 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"の形式で返します。 メソッド型の文字列表現は、型名のカンマ区切りリストをカッコで囲んだものの直後に、戻り値の型を付加したものになります。

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

        オーバーライド:
        toString 、クラス:  Object
        戻り値:
        このオブジェクトの文字列表現。
      • 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、後者は適切なクラス・ローダー引数を必要とするためです。

        戻り値:
        バイト・コードの型記述子の表現