日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
為啥用IDEA反編譯沒(méi)有擦除泛型?

前言

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

創(chuàng)新互聯(lián)長(zhǎng)期為近1000家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為昆都侖企業(yè)提供專業(yè)的網(wǎng)站制作、網(wǎng)站設(shè)計(jì),昆都侖網(wǎng)站改版等技術(shù)服務(wù)。擁有十年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。

眾所周知,Java是偽泛型,是通過(guò)類型擦除(Type Erasure)來(lái)實(shí)現(xiàn)的。為了“查看/證明”Java對(duì)泛型類型的擦除,我們常常通過(guò)反編譯的手段實(shí)現(xiàn)。Intellij IDEA作為Java開(kāi)發(fā)主流IDE,它內(nèi)置的反編譯功能是最為常用的反編譯工具。

但是,你會(huì)發(fā)現(xiàn),IDEA的反編譯竟沒(méi)有擦除泛型。

正文

如下代碼:

/**
* 在此處添加備注信息
*
* @author YourBatman's home page. https://yourbatman.cn
* @author YourBatman. Send email to me
* @author wechat:fsx641385712
* @since 0.0.1
*/
public class Tester {

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

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

System.out.println(numbers);
}

@Test
public void fun1() {
List intList = new ArrayList<>();
List 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)證此問(wèn)題,我計(jì)劃多試試幾款反編譯工具。

jd-gui

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

尷尬的是,雙擊打不開(kāi):

無(wú)奈。在虛擬機(jī)里啟了個(gè)Windows 11來(lái)跑:

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

jadx

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

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

結(jié)論:沒(méi)有擦除泛型類型。結(jié)果不說(shuō)和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é)

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

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

  1. 像IDEA內(nèi)置的Java Bytecode Decompiler?以及jadx這種比較新(還在持續(xù)迭代)的工具,稱作智能反編譯器更為合適:它能重排序代碼,并且“保留”住泛型類型,方便開(kāi)發(fā)者閱讀
  2. Java泛型引入至今已有近20年,“偽泛型”已被認(rèn)為是所有開(kāi)發(fā)者的共識(shí),沒(méi)有必要再在反編譯后體現(xiàn)出來(lái)反倒大大降低了可讀性。像Jad這種“上古”時(shí)期的反編譯器,依舊原汁原味

新聞名稱:為啥用IDEA反編譯沒(méi)有擦除泛型?
文章鏈接:http://m.5511xx.com/article/djhssjd.html