当前位置: 首页 > news >正文

赣州制作网站企业个人简历自我评价

赣州制作网站企业,个人简历自我评价,专业网站建设出售,大庆室内设计公司排名Java 的泛型常常被称为“伪泛型”,因为运行时类型系统中是擦除式泛型。然而,我们又能在框架(如 Jackson 的 TypeReference、Guava 的 TypeToken)中看到它们精准地识别出复杂的泛型结构。这背后到底发生了什么? 本文通过…

Java 的泛型常常被称为“伪泛型”,因为运行时类型系统中是擦除式泛型。然而,我们又能在框架(如 Jackson 的 TypeReference、Guava 的 TypeToken)中看到它们精准地识别出复杂的泛型结构。这背后到底发生了什么?

本文通过一个小实验,带大家从源码、编译、字节码、反编译、再到反射调用,完整地理解 泛型擦除的时机泛型信息保留的方式


一、准备实验代码

我们先自己写一个简化版的 TypeReference(避免引入 Jackson 依赖),核心思想就是:在匿名子类的父类签名里,编译器会留下泛型信息,我们在构造器里把它读出来

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;/*** 简化版的 TypeReference*/
abstract class TypeReference<T> {protected final Type type;protected TypeReference() {Type superClass = getClass().getGenericSuperclass();this.type = ((ParameterizedType) superClass).getActualTypeArguments()[0];}public Type getType() {return type;}
}public class Demo {public static void main(String[] args) {TypeReference<List<String>> ref = new TypeReference<List<String>>() {};System.out.println("Captured type = " + ref.getType());}
}

运行后输出:

Captured type = java.util.List<java.lang.String>

二、编译生成 class 文件

用 JDK 编译:

javac Demo.java

会生成两个字节码文件:

Demo.class      # 主类
Demo$1.class    # 匿名子类(new TypeReference<...>() {})

三、字节码观察

1. 主类(Demo.class)

反编译:

javap -c Demo.class

关键片段:

0: new           #2   // class per/mjn/webflux_demo/Demo$1
3: dup
4: invokespecial #3   // Method per/mjn/webflux_demo/Demo$1."<init>":()V
7: astore_1

可以看到,这里只是在创建 Demo$1 实例,类型信息完全擦除了,看不到 <List<String>>


2. 匿名类(Demo$1.class)

反编译:

javap -v Demo$1.class

输出片段:

class per.mjn.webflux_demo.Demo$1 extends per.mjn.webflux_demo.TypeReference<java.util.List<java.lang.String>>Signature: #9                           // Lper/mjn/webflux_demo/TypeReference<Ljava/util/List<Ljava/lang/String;>;>;

这里就是关键证据:

  • 类头部:显示了 extends TypeReference<List<String>>
  • Signature 属性LTypeReference<Ljava/util/List<Ljava/lang/String;>;>;
    这是编译器在 class 文件中额外写入的泛型元数据

四、运行时反射的利用

TypeReference 构造器中,我们调用:

Type superClass = getClass().getGenericSuperclass();

这个方法正是读取了 class 文件里的 Signature 元数据,然后把泛型参数还原成 ParameterizedType,所以可以打印出 List<String>


五、整个过程的时序梳理

如下图所示:

Java源代码编译器(javac).class文件JVM运行时反射API编译检查泛型 (List<String>)擦除泛型 ->> List写入字节码(擦除后的类型)同时写入 Signature 元数据 (保留泛型)类加载类型检查基于擦除后的类型提供 Signature 元数据还原出 List<String>Java源代码编译器(javac).class文件JVM运行时反射API

六、总结

  1. 泛型擦除的时机
    编译期,生成字节码前,所有泛型参数都被擦除为原始类型(如 Object)。

  2. 泛型信息保留的时机
    编译器在写 .class 文件时,会在 Signature 属性里附带泛型参数信息。

  3. 运行时 JVM 类型系统
    JVM 并不会在运行时保留泛型参数作为真正的类型信息,所有的类型检查都依赖编译期擦除后的原始类型。

  4. 反射如何利用
    通过 getGenericSuperclass()getGenericInterfaces() 等方法,能读取 class 文件中的 Signature,从而还原完整泛型结构。这就是 TypeReferenceTypeToken 等工具的原理。


七、启发

  • Java 的泛型并不是彻底消失:擦除用于运行时类型检查,Signature 保留用于反射与工具框架
  • 熟悉这套机制,能帮助我们理解:为什么 List<String> 在运行时是 ArrayList,却又能被 Jackson 精确反序列化成 List<Map<String,Integer>>

这个小实验展示了 Java 泛型的“擦除”与“保留”如何共存。理解这一点,不仅能解答“TypeReference 为何能拿到泛型参数”的疑惑,也能帮助我们写出更强大的框架级代码。

http://www.dtcms.com/a/565781.html

相关文章:

  • 寄存器与存储器的区别(TLB和Cache,指令流水线分析)
  • 思维链(CoT)× 智能体(Agent)× 提示词(Prompt)讲解
  • MAC-SQL 图1
  • 第一章 WPF概述
  • 建设网站主机免费版展厅设计与施工公司
  • 如何注册网站免费的吗wordpress注释符号
  • 博客网站快速排名常用的设计软件有哪些
  • 做直播导航网站有哪些网站后端开发语言
  • C# 常用集合的使用
  • 合肥市建设网官方网站公司微网站怎么做的
  • 网站服务器的费用如何在网站后台删除栏目
  • 3.4 Lua代码中的文件操作
  • 高盛西湖智谷引进高科技企业 聚集产业高质量发展
  • 行业网站建设公司自己怎么做一个企业官网
  • Hercules
  • Python从入门到精通:(2)Python 核心进阶教程从数据结构到面向对象
  • 普洱专业企业网站建设制作书签图片大全简单漂亮
  • 违法网站开发者网页在线短网址生成器
  • HWiNFO下载和安装图文教程(附安装包,非常详细)
  • 【Unity基础详解】(6)Unity核心:物理系统
  • LLM基础·Huggingface使用教程
  • 新手学做网站百度云做塑胶网站需要什么
  • Oracle故障处理|【实战笔记】一次“删不掉的表”:全局临时表 ORA-14452 故障复盘
  • npm install core-js不成功
  • 【论文精读】SimDA:用于高效视频生成的简单扩散适配器
  • 许昌哪个网站做苗木百度网站介绍显示图片
  • CLIP:打破模态壁垒,重塑AI理解世界的方式
  • firewall-cmd 防火墙操作技巧详解(适用于 CentOS / RHEL 系列)
  • 视频融合平台EasyCVR结合视频智能分析技术构建高空抛物智能监控系统,守护“头顶上的安全”
  • python node 网站开发广东省建设工程执业中心网站