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

Dmi*_*sky 17 java reflection types

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

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

来自Field#getGenericType():

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

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

来自TypeToken#resolveType():

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

new TypeToken<List<String>>() {}.resolveType(
    List.class.getMethod("get", int.class).getGenericReturnType())
=> String.class
Run Code Online (Sandbox Code Playgroud)
  • 这个我根本不懂.不确定这段代码在做什么.

Sot*_*lis 8

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

public List<String> parameterizedField;
Run Code Online (Sandbox Code Playgroud)

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

public E genericField;
Run Code Online (Sandbox Code Playgroud)

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

对于

public String regularTypeField;
Run Code Online (Sandbox Code Playgroud)

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


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

new TypeToken<List<String>>() {}
Run Code Online (Sandbox Code Playgroud)

在内部创建一个Type表示List<String>由于类型擦除而无法直接检索的内容.

resolveType呼叫检查Type你给它,它解析基础上TypeToken的类型参数.

在您的示例中,被getGenericReturnType()调用的将返回Type表示类中声明的类型变量的表达式List.既然你已经参数ListString,resolveType()将返回String.它将您在类型标记中提供的类型参数绑定到方法或字段中使用的相应类型变量.

你用过的吗?

new TypeToken<List<String>>() {}.
    resolveType(Iterator.class.getMethod("next").getGenericReturnType())
Run Code Online (Sandbox Code Playgroud)

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


在两种情况下解决的用途是不同的.

  • @dimadima _resolve_ 只是意味着**确定**。采取[`Path#resolve(Path)`](http://docs.oracle.com/javase/8/docs/api/java/nio/file/Path.html#resolve-java.nio.file.Path- ) 例如。采用路径`p1 = /home/ex`和另一个`p2 = some/other`,根据`p1`解析`p2`,或者`p1.resolve(p2)`将给出`/home/ex/some/其他`。它只是为一个值提供上下文以确定另一个值。 (2认同)