欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2023年05月22日 15:28:15   作者:YourBatman  
Java泛型引入至今已有近20年,“偽泛型”已被認為是所有開發(fā)者的共識,沒有必要再在反編譯后體現(xiàn)出來反倒大大降低了可讀性,這篇文章主要介紹了使用IDEA反編譯沒有擦除泛型的原因解析,需要的朋友可以參考下

??前言

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

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

但是,你會發(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,一直沿用至今:

在這里插入圖片描述

為了驗證此問題,我計劃多試試幾款反編譯工具。

??jd-gui

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

在這里插入圖片描述

尷尬的是,雙擊打不開:

在這里插入圖片描述

無奈。在虛擬機里啟了個Windows 11來跑:

在這里插入圖片描述

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

??jadx

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

在這里插入圖片描述

同樣的Windows 11上運行進行反編譯:

在這里插入圖片描述

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

??JAD

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

在這里插入圖片描述

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

在這里插入圖片描述

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

??Beyond Compare 4

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

在這里插入圖片描述

使用Beyond Compare 4進行反編譯:

在這里插入圖片描述

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

??javap -c

使用最底層的javap -c進行反編譯:

在這里插入圖片描述

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

??總結(jié)

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

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

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

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

到此這篇關(guān)于為啥用IDEA反編譯沒有擦除泛型的文章就介紹到這了,更多相關(guān)IDEA反編譯沒有擦除泛型內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Springboot中useGeneratedKeys用法小結(jié)

    Springboot中useGeneratedKeys用法小結(jié)

    本文主要介紹了Springboot中useGeneratedKeys用法小結(jié),useGeneratedKeys?是 MyBatis 框架中的一個參數(shù),用于指定是否允許 JDBC 支持自動生成主鍵,感興趣的可以了解一下
    2024-09-09
  • Spring Boot中實現(xiàn)定時任務(wù)應(yīng)用實踐

    Spring Boot中實現(xiàn)定時任務(wù)應(yīng)用實踐

    定時任務(wù)一般是項目中都需要用到的,可以用于定時處理一些特殊的任務(wù)。下面這篇文章主要給大家介紹了關(guān)于Spring Boot中實現(xiàn)定時任務(wù)應(yīng)用實踐的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下。
    2018-05-05
  • JAVA 日常開發(fā)中Websocket示例詳解

    JAVA 日常開發(fā)中Websocket示例詳解

    JAVA |日常開發(fā)中Websocket詳解,WebSocket是一種在單個TCP連接上進行全雙工通信的協(xié)議,它在Web應(yīng)用中實現(xiàn)了客戶端與服務(wù)器之間的實時數(shù)據(jù)傳輸,本文將詳細介紹Java開發(fā)中WebSocket的使用,包括基本概念、Java API、使用示例以及注意事項,感興趣的朋友一起看看吧
    2024-12-12
  • Java Web三層架構(gòu)的配置詳解

    Java Web三層架構(gòu)的配置詳解

    這篇文章主要介紹了Java Web三層架構(gòu)的配置方法,需要的朋友可以參考下
    2014-10-10
  • Spring Boot CLI安裝教程

    Spring Boot CLI安裝教程

    Spring Boot是一個命令行工具,用于使用Spring進行快速原型搭建。本文重點給大家介紹Spring Boot CLI安裝教程,感興趣的朋友參考下吧
    2017-08-08
  • Swagger中@ApiIgnore注解的使用詳解

    Swagger中@ApiIgnore注解的使用詳解

    這篇文章主要介紹了Swagger中@ApiIgnore注解的使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • java實現(xiàn)裝飾器模式(Decorator Pattern)

    java實現(xiàn)裝飾器模式(Decorator Pattern)

    這篇文章主要為大家詳細介紹了java實現(xiàn)裝飾器模式Decorator Pattern,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-10-10
  • SpringBoot的HandlerInterceptor中依賴注入為null問題

    SpringBoot的HandlerInterceptor中依賴注入為null問題

    這篇文章主要介紹了SpringBoot的HandlerInterceptor中依賴注入為null問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Struts2的配置 struts.xml Action詳解

    Struts2的配置 struts.xml Action詳解

    這篇文章主要介紹了Struts2的配置 struts.xml Action詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • 解決IDEA 2020.1版本 maven Test命令出現(xiàn)導(dǎo)包錯誤的問題

    解決IDEA 2020.1版本 maven Test命令出現(xiàn)導(dǎo)包錯誤的問題

    這篇文章主要介紹了IDEA 2020.1版本 maven Test命令出現(xiàn)導(dǎo)包錯誤的問題及解決方法,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08

最新評論