在 Java 中解析类型意味着什么?

2022-09-03 02:51:41

在 Java 中解析类型意味着什么?

以下是一些使用示例,我试图理解它们:

From Field#getGenericType()

如果基础字段的类型是类型变量或参数化类型,则创建它。否则,它将得到解决。

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

From TypeToken#resolveType()

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

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

答案 1

关于你的第一个问题,考虑一个字段声明,比如

public List<String> parameterizedField;

JVM 不维护表示类型的对象(就像维护对象一样)。因此,它需要创建一个表示该类型的新(在本例中)对象并返回它(它也可能缓存它以供将来使用)。它将做同样的事情List<String>ClassTypeParameterizedType

public E genericField;

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

public String regularTypeField;

但是,类型是已知的,JVM 维护一个对象,因此只需要返回该对象。ClassString


在第二种情况下,类型令牌黑客

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

在内部创建一个,该表示由于类型擦除而无法直接检索的。TypeList<String>

调用检查您给出的,并根据 的类型参数解析它。resolveTypeTypeTypeToken

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

您是否使用过

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

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


在这两种情况下,解析的用法是不同的。


答案 2