从 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 Type
到 Class
,或者直接从 TypeReference
或 Type
检查可分配性?
这需要在 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 因为它不是参数化的。
我有一些代码需要取消选择 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 中添加的任何功能。
根据您的代码行,
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 因为它不是参数化的。