JDK自帶javap命令反編譯class文件和Jad反編譯class文件(推薦使用jad)

来源:https://www.cnblogs.com/wang1221/archive/2022/09/16/16698918.html
-Advertisement-
Play Games

一、前言 我們在日常學習中,對一個java代碼有問題,不知道jvm內部怎麼進行解析的時候;有個偉大壯舉就是反編譯,這樣就可以看到jvm內部怎麼進行對這個java文件解析的!我們可以使用JDK自帶的javap命令來進行反編譯,反編譯出來的如果看不太明白,可以使用Jad工具來配合使用。還有就是把jar包 ...


一、前言

我們在日常學習中,對一個java代碼有問題,不知道jvm內部怎麼進行解析的時候;有個偉大壯舉就是反編譯,這樣就可以看到jvm內部怎麼進行對這個java文件解析的!我們可以使用JDK自帶的javap命令來進行反編譯,反編譯出來的如果看不太明白,可以使用Jad工具來配合使用。還有就是把jar包完全反編譯為我們寫的代碼的是GD-GUI,有興趣可以去官網看一下哈,小編這裡不做進一步說明。

JD-GUI官網下載地址

我們今天以String string = new String("wang") + new String("zhen");,這條語句在底層是怎麼創建的來深入理解jvm底層,同時也對反編譯有進一步的瞭解哈!!話不多說,跟著小編一起學習吧。

二、編寫java文件

public class JavaPTest {

    String string = new String("學") + new String("Java");
}

三、科補代碼理解

上面代碼可是創建了5個對象哈,我們一步步的說哈!
首先,會先判斷字元串常量池中是否存在"學"字元串對象,如果不存在則在字元串常量池中創建一個對象。當執行到new關鍵字在堆中創建一個"學"字元串對象。後面的new String("Java"),也是這樣。
然後,當右邊完成時,會在堆中創建一個"學Java"字元串對象。並把棧中的變數"str6"指向堆中的對象。
總結:一句代碼創建了5個對象,但是有兩個在堆中是沒有引用的,按照垃圾回收的可達性分析,他們是垃圾就是"學"、"Java"這倆垃圾。

記憶體圖如下:
在這裡插入圖片描述

小編剛剛開始也是有疑問,為什麼是五個呢?下麵我們進一步探究!!

四、javap命令

不知道有什麼命令的小伙伴,直接win+R輸入cmd 打開的視窗輸入javap即可看到一下內容

C:\Users\Administrator>javap
用法: javap <options> <classes>
其中, 可能的選項包括:
  -help  --help  -?        輸出此用法消息
  -version                 版本信息
  -v  -verbose             輸出附加信息
  -l                       輸出行號和本地變數表
  -public                  僅顯示公共類和成員
  -protected               顯示受保護的/公共類和成員
  -package                 顯示程式包/受保護的/公共類
                           和成員 (預設)
  -p  -private             顯示所有類和成員
  -c                       對代碼進行反彙編
  -s                       輸出內部類型簽名
  -sysinfo                 顯示正在處理的類的
                           系統信息 (路徑, 大小, 日期, MD5 散列)
  -constants               顯示最終常量
  -classpath <path>        指定查找用戶類文件的位置
  -cp <path>               指定查找用戶類文件的位置

心得:常用的就是javap -c -v class名字.class
例子:javap -c -v JavaPTest.class

五、執行javap命令

在IDEA的java類中按快捷鍵ctrl + f9編譯成class文件,為反編譯做準備;

找到class文件的位置
在這裡插入圖片描述
來到此目錄下,不用cd切換到這個目錄了哈
在這裡插入圖片描述

輸入javap -c -v JavaPTest.class,有反編譯後的可見,創建了5個對象。

在這裡插入圖片描述

六、下載Jad包

1. 網址下載

下載地址

在這裡插入圖片描述
2. 解壓到指定目錄

在這裡插入圖片描述

3. 配置環境變數

為什麼還要配置環境變數?

這樣在任何地方我們都可以使用cmd命令來進行反編譯,也是為了方便哈!!

PS:大家jdk都知道配置路徑,這裡小編就不帶大家一步步找到配置地方了,直接進行添加環境變數

在這裡插入圖片描述
4. 常用命令查看

不知道有什麼命令的小伙伴,直接win+R輸入cmd 打開的視窗輸入jad即可看到一下內容

C:\Users\Administrator>jad
Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov ([email protected]).
Usage:    jad [option(s)] <filename(s)>
Options: -a       - generate JVM instructions as comments (annotate)
         -af      - output fully qualified names when annotating
         -b       - generate redundant braces (braces)
         -clear   - clear all prefixes, including the default ones
         -d <dir> - directory for output files
         -dead    - try to decompile dead parts of code (if there are any)
         -dis     - disassembler only (disassembler)
         -f       - generate fully qualified names (fullnames)
         -ff      - output fields before methods (fieldsfirst)
         -i       - print default initializers for fields (definits)
         -l<num>  - split strings into pieces of max <num> chars (splitstr)
         -lnc     - output original line numbers as comments (lnc)
         -lradix<num>- display long integers using the specified radix
         -nl      - split strings on newline characters (splitstr)
         -noconv  - don't convert Java identifiers into valid ones (noconv)
         -nocast  - don't generate auxiliary casts
         -noclass - don't convert .class operators
         -nocode  - don't generate the source code for methods
         -noctor  - suppress the empty constructors
         -nodos   - turn off check for class files written in DOS mode
         -nofd    - don't disambiguate fields with the same names (nofldis)
         -noinner - turn off the support of inner classes
         -nolvt   - ignore Local Variable Table entries (nolvt)
         -nonlb   - don't insert a newline before opening brace (nonlb)
         -o       - overwrite output files without confirmation
         -p       - send all output to STDOUT (for piping)
         -pa <pfx>- prefix for all packages in generated source files
         -pc <pfx>- prefix for classes with numerical names (default: _cls)
         -pe <pfx>- prefix for unused exception names (default: _ex)
         -pf <pfx>- prefix for fields with numerical names (default: _fld)
         -pi<num> - pack imports into one line using .* (packimports)
         -pl <pfx>- prefix for locals with numerical names (default: _lcl)
         -pm <pfx>- prefix for methods with numerical names (default: _mth)
         -pp <pfx>- prefix for method parms with numerical names (default:_prm)
         -pv<num> - pack fields with the same types into one line (packfields)
         -r       - restore package directory structure
         -radix<num>- display integers using the specified radix (8, 10, or 16)
         -s <ext> - output file extension (default: .jad)
         -safe    - generate additional casts to disambiguate methods/fields
         -space   - output space between keyword (if, while, etc) and expression
         -stat    - show the total number of processed classes/methods/fields
         -t<num>  - use <num> spaces for indentation (default: 4)
         -t       - use tabs instead of spaces for indentation
         -v       - show method names while decompiling
         -8       - convert Unicode strings into ANSI strings (ansi)
         -&       - redirect STDERR to STDOUT

小編這裡就翻譯了哈,常用的就是jad -o -p class文件名稱

-o:無需確認直接覆蓋輸出
-p: 直接反編譯代碼到輸出到命令下(直接在界面顯示)

5.實踐命令

輸入:jad -o JavaPTest,會在class文件所在同一級命令生成.jad文件,看的也比較清晰,我們使用工具打開:

// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html
// Decompiler options: packimports(3) 
// Source File Name:   JavaPTest.java

package com.wang.test.demo.putong;


public class JavaPTest
{

    public JavaPTest()
    {
        string = (new StringBuilder()).append(new String("wang"))
        .append(new String("zhjen")).toString();
    }

    String string;
}

在這裡插入圖片描述

輸入:jad -o -p JavaPTest,也是五個對象更加簡單版的,不需要向上面一樣要打開文件才可以看

在這裡插入圖片描述

七、總結

這樣我們就完成了class文件反編譯了,兩種方法有利有弊,大家根據實際情況來進行反編譯。總而言之,這兩種方法都是要必須掌握的!

看到這裡了,還不給小編三連一波哈!!謝謝大家嘍!!


有緣人才可以看得到的哦!!!

點擊訪問!歡迎訪問,裡面也是有很多好的文章哦!

歡迎關註小編的微信公眾號:


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 嗨嘍,大家好呀~這裡是愛看美女的茜茜吶 又到了學Python時刻~ 第三方模塊: requests >>> pip install requests 如果安裝python第三方模塊: win + R 輸入 cmd 點擊確定, 輸入安裝命令 pip install 模塊名 (pip instal ...
  • 基本概念 持續集成 (Continuous Intergration) ​ 持續集成的重點在於構建編譯及測試,開發人員每天要提交很多次代碼到分支,在分支合併到主幹前,需要通過編譯和測試識別出問題。持續集成的流程就是通過自動化的構建(主要是構建編譯、自動化測試)來驗證,從而儘早地發現集成錯誤。 持續集 ...
  • 關於static method的解釋 想要解決上面的報錯,我們首先需要瞭解什麼叫做static method(靜態方法)。 靜態方法為類所有,一般情況下我們通過類來使用(而對於不加static的實例方法我們則只能通過對象的來調用)。 以下我們通過一些代碼的例子來對此進行說明: ## 在同一類裡面調用 ...
  • 《Java 核心技術:捲 1 基礎知識》,這本書本來是 Sun 公司的官方用書,是一本 Java 的入門參考書。 對於 Java 初學者來說,是一本非常不錯的值得時常翻閱的技術手冊。 書中有較多地方進行 Java 與 C++ 的比較,因為當時 Java 面世的時候,又被叫作 "C++ Kille... ...
  • Python入門要買什麼書容易上手?Python 是一個有條理強大的面向對象的程式設計語言。需要學習Python基礎知識,下載、安裝、導入庫、字元串處理、函數使用等。Python入門不論什麼書籍,想要熟練掌握知識點就需要多練多寫項目多思考才能進步,不同的書籍適合不同人,一定要選擇適合自己的資料學習。 ...
  • 一、什麼是動態SQL之if語句 if很簡單了,就是滿足條件就執行,不滿足條件不執行。 那麼動態SQL中的if語句是怎麼樣的呢? 首先我們來看一張表blog: 如果我們執行下麵的SQL語句: select * from blog 肯定會將所有的數據都查出來。那麼我們可以在後面加上where條件進行篩選 ...
  • 一、什麼是動態SQL 官方文檔給出了這樣的說明: 動態 SQL 是 MyBatis 的強大特性之一。如果你使用過 JDBC 或其它類似的框架,你應該能理解根據不同條件拼接 SQL 語句有多痛苦,例如拼接時要確保不能忘記添加必要的空格,還要註意去掉列表最後一個列名的逗號。利用動態 SQL,可以徹底擺脫 ...
  • 關於面試題,“什麼是鏈路追蹤”? 我們應該怎麼回答呢? 大家好,我是Mic,一個工作了14年的Java程式員 這個問題,面試官想考察什麼呢? 問題解析 鏈路追蹤是分散式架構下的一種監控方式。 對於一些規模較大的分散式系統,一個用戶的請求,可能需要涉及到多個子系統的流轉。 而且隨著業務的不斷增長,服務 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...