我有一些代码需要取消选择 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));
Run Code Online (Sandbox Code Playgroud)
但我希望有一种方法可以在不进行字符串操作的情况下做到这一点。是否有更好的方法从 Java 转到Typethe Class,或者直接从 theTypeReference或 the检查可分配性Type?
这需要在 Android 上运行,因此 Java 8 中添加的任何功能都无法使用。
根据您的代码行,
final Type type = typeRef.getType() instanceof ParameterizedType ? ((ParameterizedType)typeRef.getType()).getRawType() : typeRef.getType();
Run Code Online (Sandbox Code Playgroud)
您可以安全地将其转换为这样的类
final Class clazz = (Class)(typeRef.getType() instanceof ParameterizedType ? ((ParameterizedType)typeRef.getType()).getRawType() : typeRef.getType());
Run Code Online (Sandbox Code Playgroud)
添加更多解释 -
在第一个场景中( typeRef 是 ParameterizedType 的实例),您正在检索 rawType,它将是一个 Class。
在第二种情况下(typeRef 不是 ParameterizedType 的实例),它仍然是常规类,因为它不是参数化的。
| 归档时间: |
|
| 查看次数: |
2919 次 |
| 最近记录: |