001. 为啥用IDEA反编译没有擦除泛型?

news2024/10/5 13:15:41

在这里插入图片描述

你好,我是YourBatman:一个俗人,贪财好色。

📚前言

Java泛型是进阶高级开发必备技能之一,了解实现泛型的基本原理,有助于写出更优质的代码。

众所周知,Java是伪泛型,是通过类型擦除(Type Erasure)来实现的。为了“查看/证明”Java对泛型类型的擦除,我们常常通过反编译的手段实现。Intellij IDEA作为Java开发主流IDE,它内置的反编译功能是最为常用的反编译工具。

但是,你会发现,IDEA的反编译竟没有擦除泛型。

✍正文

如下代码:

/**
 * 在此处添加备注信息
 *
 * @author YourBatman's home page. <a href=https://yourbatman.cn>https://yourbatman.cn</a>
 * @author YourBatman. <a href=mailto:yourbatman@aliyun.com>Send email to me</a>
 * @author wechat:fsx641385712
 * @since 0.0.1
 */
public class Tester {

    @Test
    public void fun() {
        List<Integer> numbers = new ArrayList<>();
        numbers.add(18);

        List newNumbers = numbers;
        newNumbers.add("YourBatman");

        System.out.println(numbers);
    }

    @Test
    public void fun1() {
        List<Integer> intList = new ArrayList<>();
        List<String> stringList = new ArrayList<>();

        System.out.println(intList.getClass() == stringList.getClass());
    }

}

我们借助IDEA的反编译后的内容:找到需要反编译的.class文件
在这里插入图片描述
双击即可查看:
在这里插入图片描述
我的天,泛型类型不应该被擦除了吗,为毛还在?IDEA的反编译工具难道有bug?

🌈尝试其它反编译工具

IDEA最初内置的是著名的JD-GUI反编译插件,从2016年起改为自研的反编译插件Java Bytecode Decompiler,一直沿用至今:
在这里插入图片描述
为了验证此问题,我计划多试试几款反编译工具。

🚀jd-gui

下载地址:https://github.com/java-decompiler/jd-gui/releases
在这里插入图片描述
尴尬的是,双击打不开:在这里插入图片描述
无奈。在虚拟机里启了个Windows 11来跑:
在这里插入图片描述
结论:没有擦除泛型类型。和IDEA不同的是它反编译出来的结果更“原始”一丢丢

🚀jadx

下载地址:https://github.com/skylot/jadx/releases
在这里插入图片描述
同样的Windows 11上运行进行反编译:
在这里插入图片描述
结论:没有擦除泛型类型。结果不说和IDEA差不多,也是一模一样。

🚀JAD

下载地址:https://varaneckas.com/jad
在这里插入图片描述
由于我的本是基于Apple Silicon芯片的,所以只能继续在Windows上执行了:
在这里插入图片描述
结论:泛型类型被擦除了

🚀Beyond Compare 4

Beyond Compare的主业是做文件比较,其实它也可以Java反编译。只需在https://www.scootersoftware.com/download.php?zz=moreformats下载所需插件:
在这里插入图片描述
使用Beyond Compare 4进行反编译:
在这里插入图片描述
结论:泛型类型被擦除了。Beyond Compare 4的反编译基于Jad,因此效果和Jad一模一样

🚀javap -c

使用最底层的javap -c进行反编译:
在这里插入图片描述
结论:泛型类型被擦除了

🍞总结

有些擦除了但有些没有擦除泛型类型,到底该信谁呢?当然是无条件相信javap -c,因为一切反编译操作都基于它。so结论是:Java的泛型是伪泛型,编译后泛型类型都会被擦除。

记住结论的同时,通过本文对比了多个反编译器的结果亦可得到两条基本的常识:

  1. 像IDEA内置的Java Bytecode Decompiler以及jadx这种比较新(还在持续迭代)的工具,称作智能反编译器更为合适:它能重排序代码,并且“保留”住泛型类型,方便开发者阅读
  2. Java泛型引入至今已有近20年,“伪泛型”已被认为是所有开发者的共识,没有必要再在反编译后体现出来反倒大大降低了可读性。像Jad这种“上古”时期的反编译器,依旧原汁原味

推荐阅读

  • IntelliJ IDEA 2022.3正式发布,配置云同步&支持Redis好用到炸

在这里插入图片描述
本专栏源代码库:https://github.com/yourbatman/yourbatman-999-question

  • 个人博客:https://yourbatman.cn
  • 程序员网盘:https://wangpan.yourbatman.cn
  • 女娲工程:https://start.yourbatman.cn
  • 更多专栏:https://yourbatman.cn/columns |或| 公号后台回复“专栏列表”获取全部小而美的原创技术专栏

我是YourBatman,一个俗人,贪财好色。历经过延期毕业、卖保险、送外卖的大龄程序员,《梦幻西游》骨灰玩家;龙珠迷、火影迷。前大厂资深技术专家,现资深领域建模专家、Java架构师;高质量代码、DDD面向对象设计布道师;Spring开源贡献者,CSDN博客之星年度Top 10,出版书籍《Spring奇淫巧技》&《领域建模之面向对象程序设计》进行时。wx:yourbatman-u

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/555066.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis哨兵集群搭建及其原理

Redis哨兵集群搭建及其原理 1.Redis哨兵1.1.哨兵原理1.1.1.集群结构和作用1.1.2.集群监控原理1.1.3.集群故障恢复原理1.1.4.小结 2.搭建哨兵集群2.1.集群结构2.2.准备实例和配置2.3.启动2.4.测试 3.RedisTemplate3.1.引入依赖3.2.配置Redis地址3.3.配置读写分离 1.Redis哨兵 R…

Centos8安装ffmpeg,使用mediamtx搭建RTSP流媒体服务器

文章目录 1、Centos安装ffmpeg2、使用mediamtx搭建媒体服务器 1、Centos安装ffmpeg 1、先安装epel-release yum install epel-release2、安装nux存储库 rpm -v --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/…

[NSSROUND#12]杂项记录

文章目录 [NSSRound#12 Basic]Bulbasaur[NSSRound#12 Basic]Secrets in Shadow[NSSRound#12 Basic]奇怪的tex文件[NSSRound#12 Basic]坏东西[NSSRound#12 Basic]ordinary forensics[NSSRound#12 Basic]Noisy Cube[NSSRound#12 Basic]ability[NSSRound#12 Basic]strange python …

数据结构课程设计——集合的交、并和差运算

集合的交、并和差运算 数据结构课程设计任务书 学生姓名&#xff1a; 专业班级&#xff1a; 软件工程 指导教师&#xff1a; 工作单位&#xff1a; 题 目: 集合的并、交和差运算 基础要求&#xff1a; 掌握数据结构与…

最全iOS 上架指南

一、基本需求信息。 1、苹果开发人员账户&#xff08;公司已经可以无需申请&#xff0c;需要开启开发者功能&#xff0c;每年99美元&#xff09; 2、开发好应用程序 二、证书 上架版本需要使用正式证书。 1、创建Apple Developer证书 2、上传证书Sign In - Apple 3、点击开发者…

pyqt5:py处理C语言格式数组和有符号数的转换(备忘录)

文章目录 1.问题&#xff1a;把下面的数组所表示的正弦波用曲线描绘出来。1.1 将C语言数组直接替换为py数组1.2 使用numpy读入数组1.3完整代码 2.从正弦波数据生成C数组2.1 正弦波数据2.2 负数转成16位带符号整型公式2.3 负数转成16位带符号整型 完整代码 3. 生成正弦波数据的代…

ASEMI代理英飞凌IPA65R650CE功率MOS管中文资料

编辑-Z IPA65R650CE是一款高性能功率晶体管&#xff0c;旨在满足现代电子应用日益增长的需求。这种先进的半导体器件提供了高效、低功耗和优异热性能的独特组合&#xff0c;使其成为广泛应用的理想选择&#xff0c;包括电源、电机驱动和可再生能源系统。 IPA65R650CE的主要功能…

失业五个月,终于有offer了!但这家公司的风评惨不忍睹,要接吗?

往年&#xff0c;程序员们找工作可以说是不怎么费力的&#xff0c;不少求职者还会比对几家offer&#xff0c;看薪酬、看加不加班、看通勤时间等等等等&#xff0c;最后选择自己最满意的那一家过去。 但是今年&#xff0c;情况确实完全不一样&#xff0c;用网友的话形容就是“往…

vs code ts运行、断点调试解决方案

序&#xff1a; 1、解决ts在vs code里直接运行&#xff0c;并在终端直接看结果 2、解决ts 断点调试问题&#xff08;博主这个调试算的上全网最简单的设置方法了&#xff09;。 3、ts-node : 无法加载文件 C:\Program Files\nodejs\ts-node.ps1,因为在此系统上禁去看这篇》ts-no…

Velocity模板与itextpdf联合生成pdf

pom <!-- velocity模板引擎 --><dependency><groupId>org.apache.velocity</groupId><artifactId>velocity-engine-core</artifactId><version>2.3</version></dependency><!-- itext7html转pdf --><depende…

LeetCode刷题(ACM模式)-01数组

参考引用&#xff1a;代码随想录 注&#xff1a;每道 LeetCode 题目都使用 ACM 代码模式&#xff0c;可直接在本地运行&#xff0c;蓝色字体为题目超链接 0. 数组理论基础 数组&#xff08;array&#xff09;是存放在连续内存空间上的相同类型数据的集合&#xff0c;是一种复合…

【哪些人不适合学习云计算?看看有没有你!】

云计算作为是互联网技术革命的重要一员&#xff0c;也是区别于一般IT职业的。作为高级技工&#xff0c;不是谁都能学会&#xff0c;也不是谁都适合这个技术。优秀的云计算工程师能让技术成为炫耀的资本&#xff0c;玩得神乎其技&#xff0c;引得众人追捧。我想这也是大部分热爱…

Cam APP-HAL流程追踪之demo梳理

一、基础知识 1、Google官网的Cam流程如下图1 2、Cam的预览、拍照、录像是分开的 Cam的预览、拍照、录像是各自独立的-换句话说可以不开启预览拍照或者录像–后面代码会详细介绍&#xff1b;市场上的成品Cam应用&#xff0c;打开Cam后直接打开了预览&#xff0c;然后可以拍照…

【数据结构】线性表之栈、队列

前言 前面两篇文章讲述了关于线性表中的顺序表与链表&#xff0c;这篇文章继续讲述线性表中的栈和队列。 这里讲述的两种线性表与前面的线性表不同&#xff0c;只允许在一端入数据&#xff0c;一段出数据&#xff0c;详细内容请看下面的文章。 顺序表与链表两篇文章的链接&…

最新社区论坛小程序源码 含流量主功能+前后端+部署搭建教程

分享一个社区论坛小程序源码&#xff0c;含完整前后端代码包和详细的部署搭建教程&#xff0c;做地方运营很适合&#xff0c;集成了流量主功能&#xff0c;一键轻松开启。 系统功能一览&#xff1a; 广场管理&#xff1a;广场列表&#xff0c;圈子列表&#xff0c;圈子审核 帖…

CE作业(4)

一、准备前提 服务端 客户端 ; 关闭防火墙systemctl stop firewalld 关闭selinux setenforce 0 提供DNS服务的软件叫bind&#xff0c;服务名是named 一、正向解析&#xff1a; 1.装包 yum install bind -y 2.配置服务 vim /etc/named.conf #监听53号端口 #访问的是本…

​数据库原理及应用上机(实验三 SQL数据查询)

✨作者&#xff1a;命运之光 ✨专栏&#xff1a;数据库原理及应用上机实验 ​ 目录 ✨一、实验目的和要求 ✨二、实验内容及步骤 ✨三、实验结果 ✨四、附加练习 ✨五、实验总结 &#x1f353;&#x1f353;前言&#xff1a; 数据库原理及应用上机实验报告的一个简单整理…

用别人的钱创咖啡的业,戴威与陆正耀殊途同归?

文 | 新熔财经 作者 | 和花 近四年来&#xff0c;ofo退押一事没有出现任何明显的转机&#xff0c;但ofo创始人戴威却已经在海外大张旗鼓地开启了名为About Time Coffee的新创业项目。 当“ofo创始人戴威再次创业”的消息登上微博热搜&#xff0c;收获的几乎都是“还钱”的征…

字符串按规则生成字典

带数字的字符串以数字为key倒序生成字典&#xff0c;字符串列表按其元素索引为key倒序生成字典。 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 python 完全自学教程》&#xff0c;不仅仅是基础那么简…

实验室云检验信息系统(云LIS源码)

一、区域云LIS系统概述&#xff1a; 区域云LIS平台源码&#xff0c;系统完全采用B/S架构模式&#xff0c;扩展性强。整个系统的运行基于WEB层面&#xff0c;只需要在对应的工作台安装一个浏览器软件有外网即可访问。 云LIS系统为实验室服务对象提供检验申请、采集标本、结果查…