您可以像这样使用Guava的新TypeToken类(将包含在 12.0 版中……它的候选发布版本目前在 Maven 中可用):
for (Field formField : formClass.getDeclaredFields()) {
...
TypeToken<?> type = TypeToken.of(formField.getGenericType());
if (type.equals(new TypeToken<List<String>>(){}) {
...
}
}
请注意,这仅在类字段实际声明为List<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
可用here。