Dmi*_*sky 17 java reflection types
在Java中解析类型意味着什么?
以下是我尝试理解它们的一些用法示例:
如果基础字段的类型是类型变量或参数化类型,则创建它.否则,它就解决了.
根据此类型表示的类型上下文解析给定类型.例如:
new TypeToken<List<String>>() {}.resolveType(
List.class.getMethod("get", int.class).getGenericReturnType())
=> String.class
Run Code Online (Sandbox Code Playgroud)
关于你的第一个问题,请考虑一个字段声明
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.既然你已经参数List用String,resolveType()将返回String.它将您在类型标记中提供的类型参数绑定到方法或字段中使用的相应类型变量.
你用过的吗?
new TypeToken<List<String>>() {}.
resolveType(Iterator.class.getMethod("next").getGenericReturnType())
Run Code Online (Sandbox Code Playgroud)
它会返回,E因为该类型变量与您在类型标记中绑定的变量无关.
在两种情况下解决的用途是不同的.