我有一些代码需要取消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
,或者确实直接从TypeReference
或Type
检查可转让性?
这需要在Android上运行,因此无法使用Java 8中添加的任何功能。
答案 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,因为它没有参数化。