これは、リフレクションを使用してジェネリック型をいつどのように読み取ることができるかを示す優れたチュートリアルです。たとえば、firsfoo
メソッドからStringを取得するには
public void foo(List<String> s) {
// ..
}
このコードを使用できます
class MyClass {
public static void foo(List<String> s) {
// ..
}
public static void main(String[] args) throws Exception {
Method method = MyClass.class.getMethod("foo", List.class);
Type[] genericParameterTypes = method.getGenericParameterTypes();
for (Type genericParameterType : genericParameterTypes) {
if (genericParameterType instanceof ParameterizedType) {
ParameterizedType aType = (ParameterizedType) genericParameterType;
Type[] parameterArgTypes = aType.getActualTypeArguments();
for (Type parameterArgType : parameterArgTypes) {
Class parameterArgClass = (Class) parameterArgType;
System.out.println("parameterArgClass = "
+ parameterArgClass);
}
}
}
}
}
出力:parameterArgClass = class java.lang.String
リストに文字列のみを含めることができることをソースコードで明示的に宣言したため、これが可能でした。ただし、
public <T> void foo2(List<T> s){
//reflect s somehow to get T
}
Tは何でもかまいません。型消去のため、正確なTクラスに関する情報を取得することはできません。