泛型反射工具:Guava TypeToken底层反射原理深度解析

冬萱大大_5960

冬萱大大_5960

2026-05-12

995人浏览

原创

guava的typetoken通过匿名子类利用class.getgenericsuperclass()获取保留的泛型签名,再经parameterizedtype.getactualtypearguments()等反射api提取类型参数,不违反类型擦除规则。

泛型反射工具:guava typetoken底层反射原理深度解析

Guava 的 TypeToken 并不是凭空“恢复”泛型类型,而是利用 Java 反射机制中**类定义阶段保留的泛型签名信息**,通过匿名子类这一巧妙手段,在运行时重新捕获被擦除的类型参数。它不违背类型擦除规则,而是在规则允许的缝隙里精准取数。

匿名子类是关键突破口

Java 虽然在实例化对象时擦除泛型(如 new ArrayList<string>()</string> 运行时只有 ArrayList.class),但**类或接口的泛型声明**(如 class Box<t></t>)及其**继承/实现关系中的泛型实参**(如 new TypeToken<box>>() {}</box>),会作为字节码元数据保留在 Class.getGenericSuperclass() 中。

这个匿名子类本身没有逻辑,只起一个“占位+携带类型”的作用:

  • 编译器为它生成一个带泛型签名的父类引用,例如:TypeToken<box>></box>
  • 运行时调用 getClass().getGenericSuperclass(),返回的是 ParameterizedType 类型,内容就是 TypeToken<box>></box>
  • TypeToken 内部解析该 ParameterizedType,提取出实际类型参数 Box<string></string>,再递归解析其内部泛型(如 String)

底层依赖的核心反射 API

TypeToken 的实现高度依赖三个原生反射方法,全部来自 java.lang.Class 和 java.lang.reflect 包:

科学计算器在线使用工具代码
科学计算器在线使用工具代码

html5 css3制作在线科学计算器ui布局,3D计算器面板,加减乘除数字计算器工具特效。

下载
  • Class.getGenericSuperclass():获取当前类(匿名子类)的泛型父类,这是整个链条的起点
  • ParameterizedType.getActualTypeArguments():从泛型父类中提取实参列表,如 [Box<string>]</string>
  • TypeVariable.getBounds() 和 GenericArrayType.getGenericComponentType():用于处理 T extends Number、T[] 等复杂边界与数组场景

它不做任何字节码增强或运行时类生成,所有操作都在标准反射能力范围内完成。

为什么不能直接 new TypeToken>()?

语法上可以写,但必须是**匿名子类形式** —— 即末尾带 {}。这是因为:

  • 只有匿名子类才能让 JVM 在其 getGenericSuperclass() 中返回带具体类型参数的 ParameterizedType
  • 如果写成 new TypeToken<list>>()</list>(无大括号),那只是调用 TypeToken 的构造方法,此时 this.getClass() 是 TypeToken 本身,它的泛型父类是原始的 TypeToken,不含 List<string></string>
  • 所以必须靠匿名子类“骗过”JVM,让它把泛型信息挂载到子类的继承链上

对通配符和类型变量的支持原理

TypeToken 能处理 ? extends Number 或 T,靠的是完整解析 WildcardType 和 TypeVariable 接口:

  • 当泛型实参是 ? extends Number & Runnable 时,getUpperBounds() 返回 [Number, Runnable] 数组
  • 当遇到 T(类型变量),它会尝试沿继承链向上查找其声明位置(如方法或类定义),再读取其 bounds
  • TypeResolver 类进一步支持基于上下文做类型变量替换,比如将 Box<t></t> 中的 T 替换为 String

这些能力都建立在 Java 反射对 java.lang.reflect.Type 子类型的标准支持之上,TypeToken 只是做了更友好的封装和组合。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

9877

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

7022

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

6192

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1064

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

888

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1296

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2589

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

19911

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1155

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Pandas 官方文档与用户指南
Pandas 官方文档与用户指南

共0课时 | 0人学习

GDB 当前开发版文档
GDB 当前开发版文档

共0课时 | 0人学习