Java 如何使用反射检查对象的泛型类型?
我需要检查类的字段是否是Java 如何使用反射检查对象的泛型类型?,java,generics,reflection,Java,Generics,Reflection,我需要检查类的字段是否是列表。我已尝试使用以下代码来实现这一点: for (Field formField : formClass.getDeclaredFields()) { ... if (formField.getGenericType().equals((Class<List<String>>)(Class<?>)List.class)) { ... } } for(Field-formField:formClass.ge
列表
。我已尝试使用以下代码来实现这一点:
for (Field formField : formClass.getDeclaredFields()) {
...
if (formField.getGenericType().equals((Class<List<String>>)(Class<?>)List.class)) {
...
}
}
for(Field-formField:formClass.getDeclaredFields()){
...
if(formField.getGenericType().equals((Class)(Class)List.Class)){
...
}
}
这似乎是一个错误的代码,因为formField.getGenericType().equals((Class)(Class)List.Class)
即使在实际上是列表的字段上也返回false
另一种方法是首先用formField.getType().equals(List.class)
测试字段是否为List
,然后用formField.getGenericType()instanceof ParameterizedType
检查它是否为泛型,最后检查类型参数的类
但我认为有一种更短的方法来实现这种检查。有吗?您可以使用的新类(将包含在12.0版中…Maven中目前有一个候选版本)如下所示:
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
public class Main {
private List<String> strings;
private List<ReflectionUtils> list;
public static void main(String[] args) {
List<Class> genericTypes = ReflectionUtils.getGenericType(Main.class);
for(Class genericType : genericTypes) {
System.out.println(genericType.getName());
}
}
}
class ReflectionUtils {
public static List<Class> getGenericType(Class clazz) {
List<Class> genericTypes = new ArrayList<Class>();
Field[] fields = clazz.getDeclaredFields();
for(Field field : fields) {
Class c = getGenericType(field);
if(c != null) {
genericTypes.add(c);
}
}
return genericTypes;
}
public static Class getGenericType(Field field) {
Type genericType = field.getGenericType();
if(genericType instanceof ParameterizedType) {
ParameterizedType parameterizedType = (ParameterizedType) genericType;
return (Class) parameterizedType.getActualTypeArguments()[0];
}
return null;
}
}
for (Field formField : formClass.getDeclaredFields()) {
...
TypeToken<?> type = TypeToken.of(formField.getGenericType());
if (type.equals(new TypeToken<List<String>>(){}) {
...
}
}
有关TypeToken
的更多信息可用
for (Field formField : formClass.getDeclaredFields()) {
...
TypeToken<?> type = TypeToken.of(formField.getGenericType());
if (type.equals(new TypeToken<List<String>>(){}) {
...
}
}
if (new TypeToken<List<String>>(){}.isAssignableFrom(type)) {
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!");
}
}
}