从Jackson TypeReference获得课程

时间:2015-02-19 18:43:24

标签: java reflection jackson

我有一些代码需要取消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 Type转到Class,或者确实直接从TypeReferenceType检查可转让性?

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

1 个答案:

答案 0 :(得分:4)

根据您的代码行

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

您可以安全地将其投射到像这样的类

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

添加更多解释 -

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

在第二种场景中,(typeRef不是ParameterizedType的一个实例),它仍然是一个普通的Class,因为它没有参数化。