⛹️

【Java】メソッドの戻り値等でジェネリクスを含めた型情報を取得する

2021/03/28に公開

概要

Javaでクラス情報を取得する際に、メソッドの戻り値やフィールド情報の型でコレクション(List等)が設定されていることもあると思います。ただ、例えばメソッドの戻り値の型を取得する際は、MethodクラスにてgetReturnTypeを使用すると、コレクション型のみが取得できてジェネリクスの情報までは取得できません。
今回はジェネリクスを含めた型情報を、どのように取得するかというのを書いてみます。

対応方法

  • リフレクションでJava Genericsで指定された型パラメータを取得するの記事にある通り、メソッドやフィールド情報から、ジェネリクスを含めた型情報を取得する関数が用意されています。こちらの記事からの引用ですが、それぞれ用意されている関数は下記の通りになります。

    • フィールド情報: Type type = field.getGenericType();
    • メソッドの戻り値: Type type = method.getGenericReturnType();
    • メソッドの引数: Type types = method.getGenericParameterTypes();
  • このgenericTypeですが、コレクション型でない場合に呼ばれた時にどうなるかというのが、Java Reflection - Field.getGenericType() Examplesの記事にまとめられています。コレクション型でない場合はそのままの型が出力できるので、型情報を取得したい時にコレクションかどうかはあまり気にしないでも大丈夫そうです。

実装サンプル

メソッドの戻り値の型から、ジェネリクスを含めた方の名前を出力するサンプルです。

sample.java
private static void outputMethodReturnType(Method m) {
    Type genericsIncludeType = m.getGenericReturnType();
    System.out.println(genericsIncludeType.getTypeName());
}

Discussion