【问题标题】:Obtain Class from Jackson TypeReference从 Jackson TypeReference 获取类
【发布时间】:2015-02-20 03:26:55
【问题描述】:

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

// 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 中添加的任何功能都无法使用。

【问题讨论】:

  • 你能把第二行返回的类型转换成一个类吗? (类)typeRef.getType()
  • 感谢您的回复。不幸的是,我无法转换它,因为 typeRef.getType() 返回 Java Type 而不是类。

标签: java reflection jackson


【解决方案1】:

根据您的代码行,

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 的实例),您正在检索将是一个类的 rawType。

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

【讨论】:

  • 谢谢;当我之前尝试过此操作并试图将 ParameterizedTypeImpl 转换为 Class 时,我投得太早了,这就是它之前不起作用的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多