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
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...