次のように、 Guavaの新しいTypeTokenクラス (バージョン 12.0 に含まれる予定です... そのリリース候補は現在 Maven で利用可能です) を使用できます。
for (Field formField : formClass.getDeclaredFields()) {
...
TypeToken<?> type = TypeToken.of(formField.getGenericType());
if (type.equals(new TypeToken<List<String>>(){}) {
...
}
}
これは、クラス フィールドが実際にorList<String>
ではなくとして宣言されている場合にのみ機能することに注意してください。に一致させたい場合、または を実装する他のタイプに一致させたい場合は、代わりに次のチェックを行うことができます。List<T>
ArrayList<String>
ArrayList<String>
List<String>
if (new TypeToken<List<String>>(){}.isAssignableFrom(type)) {
扱っているクラスがその型で何が何であるかを指定するサブクラスである場合、宣言クラスのようにList<String>
宣言されているフィールドがあるかどうかを実際に確認することは可能です。次の例を見てください。List<T>
T
class Foo<T> {
private List<T> list;
...
}
class StringFoo extends Foo<String> { // T is specified in here
...
}
TypeToken<StringFoo> stringFooType = TypeToken.of(StringFoo.class);
// iterate through superclasses of StringFoo
for (TypeToken<?> superclass : stringFooType.getTypes().classes()) {
for (Field field : superclass.getRawType().getDeclaredFields()) {
// actually resolves T to String for the List<T> field using info from
// StringFoo's type
TypeToken<?> type = stringFooType.resolveType(field.getGenericType());
if (new TypeToken<List<String>>(){}.isAssignableFrom(type)) {
System.out.println("List<String> found!");
}
}
}
詳細については、TypeToken
こちらを参照してください。