0

0

Java中的反射API:获取泛型运行时类型的技巧(TypeToken)

P粉602998670

P粉602998670

发布时间:2026-02-12 15:25:35

|

888人浏览过

|

来源于php中文网

原创

java泛型在运行时被擦除,反射无法直接获取实际类型;需通过匿名子类typetoken、field/method的getgenerictype等保留结构间接获取,但无法还原完整类型约束。

java中的反射api:获取泛型运行时类型的技巧(typetoken)

Java反射拿不到泛型实际类型?因为Type擦除是编译期行为

Java泛型在运行时被擦除,getClass() 返回的永远是原始类型(如 ArrayList 而不是 ArrayList<string></string>)。这不是反射API的缺陷,而是JVM规范决定的——类型信息根本没进字节码。想绕过它,得靠编译期还能保留的结构:带泛型的类、方法签名、字段声明。

用TypeToken保存泛型信息:为什么必须继承匿名子类

TypeToken 本身不神奇,它的核心技巧是利用匿名内部类的 getGenericSuperclass() 获取父类声明中的完整 Type。只有继承时写死泛型参数,JVM才会在类字节码的 Signature 属性里存下这个信息。

  • ✅ 正确写法:new TypeToken<list>>() {}</list> —— 匿名子类,泛型被固化
  • ❌ 错误写法:new TypeToken(someType) —— 构造函数传参,类型早已擦除
  • ⚠️ 注意:TypeToken 是 Guava 提供的,不是 JDK 原生 API;若不用 Guava,得自己封装类似逻辑

从Field或Method中提取泛型类型:别只调用getGenericType()

Field.getGenericType()Method.getGenericReturnType() 确实返回 Type,但直接 toString() 很可能还是看到 List<t></t> 这种变量名。关键是要做类型解析:

帮小忙
帮小忙

腾讯QQ浏览器在线工具箱平台

下载
  • 遇到 ParameterizedType:用 getActualTypeArguments() 拿真实类型数组(比如 List<map integer>></map> 的第二层泛型)
  • 遇到 TypeVariable:说明是类/方法定义里的形参(如 <t extends number></t>),此时需结合所在类的 getTypeParameters() 和实际上下文推导
  • 遇到 WildcardType:如 ? super CharSequence,需分别检查 getLowerBounds()getUpperBounds()

常见坑:ClassCastException 和泛型数组创建失败

拿到 Type 不等于能直接 new 实例。JVM 不允许泛型数组(new List<string>[10]</string> 编译报错),而用 Array.newInstance() 传入 type.getClass() 又会得到原始类型数组。

立即学习Java免费学习笔记(深入)”;

  • 泛型数组只能靠 Object[] + 显式转型,且无法在运行时校验元素类型
  • TypeToken 解析出 List<string></string> 后,仍不能直接 cast 到 List<string></string> —— 反射返回的 list 实际是 ArrayList,类型安全靠开发者保证
  • 某些场景(如 JSON 反序列化)依赖 Type 构造器传参,但 Gson/Jackson 对嵌套通配符支持有限,容易静默退化为 LinkedTreeMap

泛型类型信息就像一张快照,拍下来容易,还原成可执行的类型约束很难。最稳的路,是让泛型出现在类声明或字段上,而不是临时拼出来的 Type

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

436

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

544

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

317

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

81

2025.09.10

guava包作用
guava包作用

guava是一个java库,增强了java标准库,提供更有效率和易于使用的集合、实用程序、缓存和并发工具。想了解更多guava的相关内容,可以阅读本专题下面的文章。

265

2024.05.29

雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

2

2026.02.12

豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法
豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法

本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。

41

2026.02.12

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

7

2026.02.12

Next.js全栈开发与SSR服务端渲染实战
Next.js全栈开发与SSR服务端渲染实战

本专题系统讲解 Next.js 框架在现代全栈开发中的应用,重点解析 SSR、SSG 与 ISR 渲染模式的原理与差异。内容涵盖路由系统、API Routes、数据获取策略、性能优化以及部署实践。通过完整项目示例,帮助开发者掌握高性能 SEO 友好的 React 全栈开发方案。

1

2026.02.12

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3.5万人学习

C# 教程
C# 教程

共94课时 | 9.3万人学习

Java 教程
Java 教程

共578课时 | 64.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号