精品熟女碰碰人人a久久,多姿,欧美欧美a v日韩中文字幕,日本福利片秋霞国产午夜,欧美成人禁片在线观看

使用IDEA反編譯沒有擦除泛型的原因解析

使用idea反編譯沒有擦除泛型的原因解析

 

前言

java泛型是進(jìn)階高級(jí)開發(fā)必備技能之一,了解實(shí)現(xiàn)泛型的基本原理,有助于寫出更優(yōu)質(zhì)的代碼。

眾所周知,java是偽泛型,是通過類型擦除(type erasure)來實(shí)現(xiàn)的。為了“查看/證明”java對(duì)泛型類型的擦除,我們常常通過反編譯的手段實(shí)現(xiàn)。intellij idea作為java開發(fā)主流ide,它內(nèi)置的反編譯功能是最為常用的反編譯工具。

但是,你會(huì)發(fā)現(xiàn),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的反編譯后的內(nèi)容:找到需要反編譯的.class文件

在這里插入圖片描述

雙擊即可查看:

在這里插入圖片描述


我的天,泛型類型不應(yīng)該被擦除了嗎,為毛還在?idea的反編譯工具難道有bug?

嘗試其它反編譯工具

idea最初內(nèi)置的是著名的jd-gui反編譯插件,從2016年起改為自研的反編譯插件java bytecode decompiler,一直沿用至今:

在這里插入圖片描述

為了驗(yàn)證此問題,我計(jì)劃多試試幾款反編譯工具。

jd-gui

下載地址:https://github.com/java-decompiler/jd-gui/releases

在這里插入圖片描述

尷尬的是,雙擊打不開:

在這里插入圖片描述

無奈。在虛擬機(jī)里啟了個(gè)windows 11來跑:

在這里插入圖片描述

結(jié)論:沒有擦除泛型類型。和idea不同的是它反編譯出來的結(jié)果更“原始”一丟丟

jadx

下載地址:https://github.com/skylot/jadx/releases

在這里插入圖片描述

同樣的windows 11上運(yùn)行進(jìn)行反編譯:

在這里插入圖片描述

結(jié)論:沒有擦除泛型類型。結(jié)果不說和idea差不多,也是一模一樣。

jad

下載地址:https://varaneckas.com/jad

在這里插入圖片描述

由于我的本是基于apple silicon芯片的,所以只能繼續(xù)在windows上執(zhí)行了:

在這里插入圖片描述

結(jié)論:泛型類型被擦除了。

beyond compare 4

beyond compare的主業(yè)是做文件比較,其實(shí)它也可以java反編譯。只需在https://www.scootersoftware.com/download.php?zz=moreformats下載所需插件:

在這里插入圖片描述

使用beyond compare 4進(jìn)行反編譯:

在這里插入圖片描述

結(jié)論:泛型類型被擦除了。beyond compare 4的反編譯基于jad,因此效果和jad一模一樣

javap -c

使用最底層的javap -c進(jìn)行反編譯:

在這里插入圖片描述

結(jié)論:泛型類型被擦除了。

 

總結(jié)

有些擦除了但有些沒有擦除泛型類型,到底該信誰呢?當(dāng)然是無條件相信javap -c,因?yàn)橐磺蟹淳幾g操作都基于它。so結(jié)論是:java的泛型是偽泛型,編譯后泛型類型都會(huì)被擦除。

記住結(jié)論的同時(shí),通過本文對(duì)比了多個(gè)反編譯器的結(jié)果亦可得到兩條基本的常識(shí):

  • 像idea內(nèi)置的java bytecode decompiler以及jadx這種比較新(還在持續(xù)迭代)的工具,稱作智能反編譯器更為合適:它能重排序代碼,并且“保留”住泛型類型,方便開發(fā)者閱讀
  • java泛型引入至今已有近20年,“偽泛型”已被認(rèn)為是所有開發(fā)者的共識(shí),沒有必要再在反編譯后體現(xiàn)出來反倒大大降低了可讀性。像jad這種“上古”時(shí)期的反編譯器,依舊原汁原味 推薦閱讀 intellij idea 2022.3正式發(fā)布,配置云同步&支持redis好用到炸

本專欄源代碼庫:https://github.com/yourbatman/yourbatman-999-question

關(guān)于為啥用idea反編譯沒有擦除泛型的文章就介紹至此,更多相關(guān)idea反編譯沒有擦除泛型內(nèi)容請(qǐng)搜索碩編程以前的文章,希望以后支持碩編程!

下一節(jié):java解決動(dòng)態(tài)配置字段需求問題介紹

java編程技術(shù)

相關(guān)文章