【问题标题】:What does it mean to resolve a type in Java?在 Java 中解析类型是什么意思?
【发布时间】:2015-10-19 13:18:38
【问题描述】:

在 Java 中解析类型是什么意思?

以下是我尝试理解它们的一些用法示例:

来自Field#getGenericType()

如果底层字段的类型是类型变量或参数化类型,则创建它。否则就解决了。

  • 需要创建类型变量或参数化类型才能使这种形式的反射起作用,因为它们无法加载,因为它们在运行时并不真正“存在”?
  • 那么,如果运行时存在某些问题,是否可以“解决”?通过类加载器?

来自TypeToken#resolveType()

根据此类型表示的类型上下文解析给定类型。例如:

new TypeToken<List<String>>() {}.resolveType(
    List.class.getMethod("get", int.class).getGenericReturnType())
=> String.class
  • 这我真的不明白。不确定这段代码在做什么。

【问题讨论】:

  • “解决”的两个意思不同,所以这应该是两个独立的问题。
  • hmm...getGenericType() 也可以返回 GenericArrayType

标签: java reflection types


【解决方案1】:

关于你的第一个问题,考虑像这样的字段声明

public List<String> parameterizedField;

JVM 不维护表示List&lt;String&gt; 类型的对象(就像Class 对象一样)。因此它需要创建一个表示该类型的新Type(在本例中为ParameterizedType)对象并返回它(它也可能缓存它以备将来使用)。它会为

public E genericField;

在这种情况下创建一个TypeVariable 对象。

对于

public String regularTypeField;

但是,类型是已知的,JVM 为String 维护一个Class 对象,因此只需返回它。


第二种情况,type token hack

new TypeToken<List<String>>() {}

在内部创建一个代表List&lt;String&gt;Type,否则由于类型擦除而无法直接检索。

resolveType 调用会检查您提供给它的 Type,并根据 TypeToken 的类型参数对其进行解析。

在您的示例中,调用的getGenericReturnType() 将返回一个Type,表示在List 类中声明的类型变量。由于您已将 List 参数化为 String,因此 resolveType() 将返回 String。它将您在类型标记中提供的类型参数绑定到其在方法或字段中使用的相应类型变量。

你用过吗

new TypeToken<List<String>>() {}.
    resolveType(Iterator.class.getMethod("next").getGenericReturnType())

它会返回E,因为该类型变量与您在类型标记中绑定的变量无关。


resolved在这两种情况下的用途是不同的。

【讨论】:

  • 谢谢 Sotirios。仍然:“resolveType 调用检查你给它的Type 并根据TypeToken 的类型参数解析它。”这是什么意思?我理解你所说的组成组件,但我不理解这个“解决”
  • 例如,我知道一些概念,例如解析文件系统或 URL 中的相对路径。说nodejs.org/api/url.html#url_url_resolve_from_to
  • @dimadima To resolve 仅仅意味着 determine。以Path#resolve(Path) 为例。选择一条路径p1 = /home/ex 和另一个p2 = some/other,根据p1 解析p2,或者p1.resolve(p2) 将给出/home/ex/some/other。它只是为一个值提供上下文以确定另一个值。
  • @dimadima 对于Type,上下文是TypeToken 和您提供的类型参数。使用resolveType,您可以提供绑定相应类型参数的用途。
  • 假设您正在使用 Iterator&lt;Integer&gt; 并想知道其方法 next() 的返回类型(您显然无法直接知道),您将解析 next针对代表Iterator&lt;Integer&gt;TypeToken。在这种情况下,next 的返回类型将为 Integer
猜你喜欢
  • 2011-11-05
  • 1970-01-01
  • 1970-01-01
  • 2012-08-13
  • 2014-10-16
  • 2017-01-07
  • 1970-01-01
  • 2013-08-11
  • 1970-01-01
相关资源
最近更新 更多