1. 程式人生 > >Java 反編譯命令javap

Java 反編譯命令javap

javap是jdk自帶的一個工具,可以對程式碼反編譯,也可以檢視java編譯器生成的位元組碼。

一般情況下,很少有人使用javap對class檔案進行反編譯,因為有很多成熟的反編譯工具可以使用,比如jad。但是,javap還可以檢視java編譯器為我們生成的位元組碼。通過它,可以對照原始碼和位元組碼,從而瞭解很多編譯器內部的工作。

例項

javap命令分解一個class檔案,它根據options來決定到底輸出什麼。如果沒有使用options,那麼javap將會輸出包,類裡的protected和public域以及類裡的所有方法。javap將會把它們輸出在標準輸出上。來看這個例子,先編譯(javac

)下面這個類。

import java.awt.*;import java.applet.*;publicclassDocFooterextendsApplet{String date;String email;publicvoid init(){
                resize(500,100);
                date = getParameter("LAST_UPDATED");
                email = getParameter("EMAIL");}publicvoid paint(Graphics g){
                g
.drawString(date +" by ",100,15); g.drawString(email,290,15);}}

在命令列上鍵入javap DocFooter後,輸出結果如下

Compiledfrom"DocFooter.java"publicclassDocFooterextends java.applet.Applet{
  java.lang.String date;
  java.lang.String email;publicDocFooter();publicvoid init();publicvoid paint(java.awt.Graphics
);}

如果加入了-c,即javap -c DocFooter,那麼輸出結果如下

Compiledfrom"DocFooter.java"publicclassDocFooterextends java.applet.Applet{
  java.lang.String date;

  java.lang.String email;publicDocFooter();Code:0: aload_0       
       1: invokespecial #1                  // Method java/applet/Applet."<init>":()V4:returnpublicvoid init();Code:0: aload_0       
       1: sipush        5004: bipush        1006: invokevirtual #2                  // Method resize:(II)V9: aload_0       
      10: aload_0       
      11: ldc           #3                  // String LAST_UPDATED13: invokevirtual #4                  // Method getParameter:(Ljava/lang/String;)Ljava/lang/String;16: putfield      #5                  // Field date:Ljava/lang/String;19: aload_0       
      20: aload_0       
      21: ldc           #6                  // String EMAIL23: invokevirtual #4                  // Method getParameter:(Ljava/lang/String;)Ljava/lang/String;26: putfield      #7                  // Field email:Ljava/lang/String;29:returnpublicvoid paint(java.awt.Graphics);Code:0: aload_1       
       1:new#8                  // class java/lang/StringBuilder4: dup           
       5: invokespecial #9                  // Method java/lang/StringBuilder."<init>":()V8: aload_0       
       9: getfield      #5                  // Field date:Ljava/lang/String;12: invokevirtual #10                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;15: ldc           #11                 // String  by 17: invokevirtual #10                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;20: invokevirtual #12                 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;23: bipush        10025: bipush        1527: invokevirtual #13                 // Method java/awt/Graphics.drawString:(Ljava/lang/String;II)V30: aload_1       
      31: aload_0       
      32: getfield      #7                  // Field email:Ljava/lang/String;35: sipush        29038: bipush        1540: invokevirtual #13                 // Method java/awt/Graphics.drawString:(Ljava/lang/String;II)V43:return}

上面輸出的內容就是位元組碼。

用法摘要

-help 幫助-l 輸出行和變數的表-public只輸出public方法和域-protected只輸出publicprotected類和成員-package只輸出包,publicprotected類和成員,這是預設的-p -private輸出所有類和成員-s 輸出內部型別簽名-c 輸出分解後的程式碼,例如,類中每一個方法內,包含java位元組碼的指令,-verbose 輸出棧大小,方法引數的個數-constants 輸出靜態final常量

總結

javap可以用於反編譯和檢視編譯器編譯後的位元組碼。平時一般用javap -c比較多,該命令用於列出每個方法所執行的JVM指令,並顯示每個方法的位元組碼的實際作用。可以通過位元組碼和原始碼的對比,深入分析java的編譯原理,瞭解和解決各種Java原理級別的問題。

相關推薦

Java 編譯命令javap

javap是jdk自帶的一個工具,可以對程式碼反編譯,也可以檢視java編譯器生成的位元組碼。 一般情況下,很少有人使用javap對class檔案進行反編譯,因為有很多成熟的反編譯工具可以使用,比如jad。但是,javap還可以檢視java編譯器為我們生成的位元組碼

Java中的String,javap&cfr.jar編譯javap編譯後二進位制指令程式碼詳解,Java8常量池的位置

一個例子   public class TestString{ public static void main(String[] args){ String a = "a"; String b = a+"b";

JVM 使用javap編譯命令解釋i++和++i的區別

一個簡單的例子 public class Test{ public static void main(String[] args){ int i = 0; int j = 1; int k = 2;

eclipse安裝JAVA編譯插件

-c image 需要 自帶 多好 反編譯工具 get 激活 bsp eclipse安裝JAVA反編譯插件 前言:在實際的開發中幾乎都會使用到一些框架來輔助項目的開發工作,對於一些框架的代碼我們總懷有一些好奇之心,想一探究竟,有源碼當然更好了,對於有些JAR包

Eclipse4.4 安裝java編譯插件Eclipse Class Decompiler

模式 編輯 多個 位置 trac 存在 eat 依賴 debug 一、在線安裝方式: Eclipse Class Decompiler整合了眼下最好的2個Java反編譯工具Jad和JD-Core,而且和Eclipse Class View

Eclipse Class Decompiler——Java編譯插件(轉)

ont git 選項 jd-core 格式化工具 透視圖 下載 數據 編譯器 Eclipse Class Decompiler是一款Eclipse插件,整合了多種反編譯器,和Eclipse Class Viewer無縫集成,能夠很方便的使用插件查看類庫源碼,進行Debug調

java 編譯

編譯 new pan tty upd class decompile ini location Step 1: Go to Help -> Install New Software -> click on ‘Add‘ Step 2: On pop-up fi

Java編譯工具Jad及插件JadClipse配置教程

nload index.php 打開方式 1.5 配置 directive img 點擊 臨時文件 Jad是一個Java的一個反編譯工具,和eclipse的插件JadClipse,二者結合可以方便的在eclipse中查看class文件的源代碼。 下面介紹一下配置: 下載J

Java編譯工具-JD-GUI

編譯工具 直接 修改 技術 src 估計 ref img 跨平臺 Java是跨平臺的,JD-GUI提供了多個系統的支持,但是不建議直接安裝,最快的方式推薦直接下載JAR包,然後用java -jar進行運行。 就現在的版本是1.4.0,停留在2015年,估計近期會更新,因為

Java編譯工具:Java Decompiler

分析 class文件 項目 class ui界面 eclips pos 開發 markdown Java Decompiler項目旨在開發一套工具集,這套工具集可以反編譯並分析Java5之後的Java字節碼。 它主要包括四個部分。 JD-Core:Java Decompi

Java編譯工具

Java反編譯 JD 反編譯工具 Eclipse反編譯插件 decompiler Java反編譯工具在Eclipse下可以選擇Eclipse-Class-Decompiler插件, 他是集成了很多工具,有jd,jad,crf等。Java反編譯工具 參考鏈接:Eclipse-Class-De

Java編譯工具Luyten-0.5.3

喜歡 title blank jar包文件 http 文件 使用 tps 比較 Luyten是一款很強大的反編譯工具包,是一款github的開源工具,軟件功能非常強大,界面簡潔明晰、操作方便快捷,設計得很人性化。 工具軟件下載路徑:https://github.com/de

Java 編譯工具幾枚(class轉java)

java sdk iter 下載地址 mirror file .net trac .html class 1.Java Decompiler Yet another fast Java decompiler. 下載地址:http://jd.benow.ca/#jd-

java編譯工具cfr

www. itl ava case color dir nbsp 默認目錄 tle http://www.benf.org/other/cfr/ 下載反編譯工具 @echo off SET home=%cd% rem 指定存放jar包的目錄 SET

java編譯工具jad

tree 選項 基礎 修改 sof 建立 引用 .html 根據 下好以後解壓就可以用了,軟件就只有一個exe文件和一個幫助文件。在眾多的JAVA反編譯工具中,有幾種非常著名的工具使用了相同的核心引擎——JAD,其中主要包括:FrontEnd Plus、mDeJava、De

Java編譯工具Jad詳解

做專案過程中需要反編譯一個jar包,於是作了一些學習,記錄下來。 Jad(JAva Decompiler)是一個Java的反編譯器,可以通過命令列把Java的class檔案反編譯成原始碼。 如果你在使用編寫程式碼的時候遇到找不到原始碼的第三方庫,而且你又需要看看這個庫的具體實現,那麼你就需要使用

Java編譯工具CFR,Procyon簡介

Java反編譯工具有很多,個人覺得使用最方便的是jd-gui,當然jad也不錯,jd-gui主要提供了圖形介面,操作起來很方便,但是jd-gui很久沒有更新了,java 7出來很久了,jd-gui在反編譯java 7的class檔案時候會遇到部分語法不支援的問題,下面我舉幾個例子,我使用的是jd-gui035

Java編譯工具-JD-GUI下載以及使用

介紹 Java反編譯工具-JD-GUI 下載 https://download.csdn.net/download/badao_liumang_qizhi/10798142 使用 下載工具,雙擊exe檔案開啟 開啟之後 選擇左上角File--Open File

eclipse 安裝Java編譯外掛

在eclipse下安裝反編譯外掛可以直接檢視 .class 檔案對應的java原始碼。 -----------------------下載 ----------------------------------------- 反編譯外掛需要有 jad.exe 和 jad

最新支援java8的Java編譯工具彙總(大全)!!

大多商業軟體,會對程式進行加密、加殼等安全措施以防範軟體被破解,從而使得反編譯越來越難。反編譯是一個對目標可執行程式進行逆向分析,從而得到原始碼的過程。尤其是像Java這樣的執行在虛擬機器上的程式語言,更容易進行反編譯得到原始碼。       我