JavaでList・Set・Map等の総称型で定義されたフィールドの型パラメータを取得するには

import java.util.List;
import java.util.Map;
import java.util.Set;

public class Test {
	private List<String> list;
	private Set<Integer> set;
	private Map<String, Long> map;
}

このクラスのフィールドlist, set, mapの型パラメータを、このクラスのインスタンスを介さずに取得したい。具体的にはlistとsetについては格納できる値の型を、mapについてはキーと値の型を取得したい。次のようにするとこういうことが可能になります。

import java.lang.reflect.ParameterizedType;

ParameterizedType listPt = (ParameterizedType) Test.class.getDeclaredField("list").getGenericType();
System.out.printf("list: %s\n", listPt.getActualTypeArguments()[0].toString());
ParameterizedType setPt = (ParameterizedType) Test.class.getDeclaredField("set").getGenericType();
System.out.printf("set: %s\n", setPt.getActualTypeArguments()[0].toString());
ParameterizedType mapPt = (ParameterizedType) Test.class.getDeclaredField("map").getGenericType();
System.out.printf("map: %s, %s\n", mapPt.getActualTypeArguments()[0].toString(), mapPt.getActualTypeArguments()[1].toString());

出力結果は次のようになります。

list: class java.lang.Integer
set: class java.lang.String
map: class java.lang.String, class java.lang.Long