从 Jackson TypeReference 获取 Class

Obtain Class from Jackson TypeReference

我有一些代码需要取消选择 Jackson TypeReference 以确定它是否是一个集合。目前我能想到的最好的是:

// Sample type reference - in reality this is an argument to the method
final TypeReference<List<String>> typeRef = new TypeReference<List<String>>(){};

// Obtain the Java reflection type from the TypeReference
final Type type = typeRef.getType() instanceof ParameterizedType ? ((ParameterizedType)typeRef.getType()).getRawType() : typeRef.getType();

// Obtain the name of the class (or interface)
final String typeName = type.toString().replace("class ", "").replace("interface ", "");

// And find out if it is a Collection
final boolean isCollection = Collection.class.isAssignableFrom(Class.forName(typeName));

但我希望有一种无需字符串操作即可执行此操作的方法。有没有更好的方法从 Java TypeClass,或者直接从 TypeReferenceType 检查可分配性?

这需要在 Android 上运行,因此无法使用 Java 8 中添加的任何功能。

根据您的代码行,

final Type type = typeRef.getType() instanceof ParameterizedType ? ((ParameterizedType)typeRef.getType()).getRawType() : typeRef.getType();

您可以像这样安全地将其转换为 Class

final Class clazz = (Class)(typeRef.getType() instanceof ParameterizedType ? ((ParameterizedType)typeRef.getType()).getRawType() : typeRef.getType());

再补充一点解释 -

在第一个场景中(typeRef 是 ParameterizedType 的一个实例),您正在检索 rawType,它将是 Class。

在第二种情况下(typeRef 不是 ParameterizedType 的实例),它仍然是常规 Class 因为它不是参数化的。