成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

為啥用IDEA反編譯沒有擦除泛型?

開發 前端
有些擦除了但有些沒有擦除泛型類型,到底該信誰呢?當然是無條件相信??javap -c??,因為一切反編譯操作都基于它。so結論是:Java的泛型是偽泛型,編譯后泛型類型都會被擦除。

??前言

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這種“上古”時期的反編譯器,依舊原汁原味
責任編輯:武曉燕 來源: YourBatman
相關推薦

2020-12-21 16:18:07

JavaTypeToken泛型擦除

2019-09-04 00:20:10

JSON泛型擦除

2021-07-01 06:47:30

Java泛型泛型擦除

2021-07-29 09:20:18

Java泛型String

2025-05-30 02:31:00

2024-06-07 10:05:31

2021-08-24 08:05:41

泛型類型擦除Class

2022-03-02 14:41:03

泛型反序列化

2024-01-15 08:28:31

Spring事件

2015-01-15 11:01:43

2025-01-13 07:00:00

Java泛型編程

2011-05-31 14:52:13

Android 反編譯 方法

2021-09-29 18:17:30

Go泛型語言

2021-03-07 16:31:35

Java編譯反編譯

2017-02-20 13:54:14

Java代碼編譯

2015-01-15 10:15:16

Android反編譯-smail語法

2011-05-31 14:38:04

Android 反編譯

2021-08-22 17:18:58

Go代碼泛型代碼

2009-09-25 10:03:51

Java泛型

2021-06-24 09:08:34

Java代碼泛型
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文字幕亚洲一区二区三区 | 视频1区2区 | 另类亚洲视频 | 成人高清网站 | 国产日韩欧美精品一区二区三区 | 久久久久久国模大尺度人体 | 黄色a视频 | 亚洲精品久 | 精品国产三级 | 亚洲欧美视频一区二区 | 成人国内精品久久久久一区 | 日韩欧美三区 | 久久精品久久久久久 | www成人啪啪18| 国产激情偷乱视频一区二区三区 | 国产免费一区二区三区最新6 | 91大神新作在线观看 | 日韩一级免费电影 | 国产成人精品一区二区三区四区 | 日韩免费视频一区二区 | 免费久久久 | 亚洲国产成人精品女人久久久野战 | 中国美女av | 特一级黄色毛片 | 美女网站视频免费黄 | 欧美日韩久 | 日韩中文字幕 | 九九综合 | 国产国语精品 | 国产成人精品一区二区三区 | 亚洲精品视频在线观看视频 | 韩日视频在线观看 | 国产精品久久久久久吹潮 | 色网在线观看 | 中文字幕在线剧情 | 欧美自拍一区 | 国产一区二 | 一区二区三区视频在线免费观看 | 九九免费 | 欧美成视频| 日本免费一区二区三区视频 |