javap,javappt下載

本文目錄一覽:

JVM_位元組碼文件(ClassFile)詳解

我們知道 javac 命令可以將 .java 文件編譯成 .class 文件,而這個 Class 文件 中包含了 Java虛擬機 指令集、符號表以及若干其他輔助信息;最終將在 Java虛擬機 運行。

本文是以 JVM8 為例的。

每一個 Class文件 都有如下的 ClassFile 文件結構:

先簡單介紹一下 ClassFile 文件結構各部分含義:

描述符是表示字段或方法類型的字符串。

字段描述符表示類、實例或局部變量的類型。

從上面文法可以看出,字段描述符中一共有三個類型:

方法描述符包含 0 個或者多個參數描述符以及一個返回值描述符。

看了描述符,可能大家有點疑惑,泛型信息怎麼表示啊?

常量池的通用格式如下:

目前 JVM8 中一共用 14 種常量類型,分別如下:

我們知道要使用一個字段或者調用一個方法,就必須知道字段或者方法所屬類符號引用,和字段的名字和類型,方法的名字和方法參數類型以及方法返回值類型。

但是我們知道類是能繼承的,那麼子類調用父類的方法或者字段,這裡的所屬類符號引用,到底是子類本身還是父類的呢?

我們知道類,方法,字段都有不同的訪問標誌,在 Class 文件 中使用一個 u2 類型數據項來存儲,也就是最多可以有 16 個不同標誌位。

在類,方法,字段中有相同的標誌,也有不同的標誌,總體規劃,我們可以藉助 Modifier 類的源碼來了解:

在 Modifier 類中,類的訪問標誌:

我們知道在 java 中類可以用的修飾符有: public , protected , private , abstract , static , final , strictfp 。

但是我們再看 Class 文件 中類的訪問標誌:

仔細看,你會發現有些不同點:

在 Modifier 類中,字段的訪問標誌:

我們知道在 java 中字段可以用的修飾符有: public , protected , private , static , final , transient 和 volatile 。

但是我們再看 Class 文件 中字段的訪問標誌:

Class 文件 中字段的訪問標誌和 java 中字段的修飾符差不多,只是多了 ACC_SYNTHETIC 和 ACC_ENUM 兩個標誌。

在 Modifier 類中,方法的訪問標誌:

我們知道在 java 中方法可以用的修飾符有:

public , protected , private , abstract , static , final , synchronized , synchronized 和 strictfp 。

但是我們再看 Class 文件 中方法的訪問標誌:

字段詳情 field_info 的格式如下:

方法詳情 method_info 的格式如下:

關於 Class 文件 中屬性相關信息,我們再後面章節介紹。

我們可以通過 javap 的命令來閱讀 Class 文件 中相關信息。

這個是最簡單的一個類,沒有任何字段和方法,只繼承 Object 類,我們來看看它編譯後的位元組碼信息,通過 javap -p -v T.class 的命令:

我們重點關注常量池相關信息,會發現雖然 T.class 很乾凈,但是也有 15 個常量,來我們依次分析:

與之前的例子相比較,多了一個字段和方法,那麼得到的位元組碼信息如下:

但是你會發現常量池中怎麼沒有這個字段 name 的 CONSTANT_Fieldref_info 類型的常量呢?

那是因為我們沒有使用這個字段。

多寫了一個方法 test1 來調用 name 字段和 test 方法,那麼得到的位元組碼信息如下:

這裡定義一個父類 TParent ,有一個公共字段 name 和方法 say 。子類

怎樣使用javap來反編譯class文件

當然可以了。在java軟件包的bin文件夾下有一個javap程序,就是用來反編譯的。 用法如java一樣。就是先用javac變成位元組碼文件就是.class文件後,用javap 加上文件名就可以反編譯了。 舉個例子test.class,反編譯用javap test就行了。

jdk是什麼

JDK(Java Development Kit)是Sun微系統針對Java開發人員發佈的免費軟件開發工具包(SDK,Software development kit)。自從Java推出以來,JDK已經成為使用最廣泛的Java SDK。

JDK包含了一批用於Java開發的組件,其中包括:

javac:編譯器,將後綴名為.java的源代碼編譯成後綴名為「.class」的位元組碼

java:運行工具,運行.class的位元組碼

jar:打包工具,將相關的類文件打包成一個文件

javadoc:文檔生成器,從源碼注釋中提取文檔,注釋需符合規範

jdb debugger:調試工具

jps:顯示當前java程序運行的進程狀態

javap:反編譯程序

javap可以反編譯pak文件嗎

概述:

javap是 Java class文件分解器,可以反編譯,也可以查看java編譯器生成的位元組碼,從而對代碼內部的執行邏輯進行分析。

語法:

把java文件編譯為class文件:javac Test.java (Test.java為java文件名) 生成對應的 .class 文件 Test.class

執行javap操作:javap 命令行 class文件名稱(不加 .class後綴)

例如: javap -c Test

命令行

-help 輸出 javap 的幫助信息。

-l 輸出行及局部變量表。

-b 確保與 JDK 1.1 javap 的向後兼容性。

-public 只顯示 public 類及成員。

-protected 只顯示 protected 和 public 類及成員。

-package 只顯示包、protected 和 public 類及成員。這是缺省設置。

-private 顯示所有類和成員。

-J[flag] 直接將 flag 傳給運行時系統。

-s 輸出內部類型簽名。

-c 輸出類中各方法的未解析的代碼,即構成 Java 位元組碼的指令。

-verbose 輸出堆棧大小、各方法的 locals 及 args 數,以及class文件的編譯版本

-classpath[路徑] 指定 javap 用來查找類的路徑。如果設置了該選項,則它將覆蓋缺省值或 CLASSPATH 環境變量。目錄用冒號分隔。

  – bootclasspath[路徑] 指定加載自舉類所用的路徑。缺省情況下,自舉類是實現核心 Java 平台的類,位於 jrelibt.jar 和 jrelibi18n.jar 中。

-extdirs[dirs] 覆蓋搜索安裝方式擴展的位置

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/153983.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-15 03:25
下一篇 2024-11-15 03:25

相關推薦

  • 深入淺出javap命令

    一、javap簡介 javap是JDK自帶的一款小工具,用來對Java位元組碼文件進行反編譯操作。通過javap反編譯可以查看Java類中的方法、字段、指令、常量池等詳細信息。 二、…

    編程 2025-02-15
  • javap使用實例圖解,實例方法java

    本文目錄一覽: 1、怎樣使用javap來反編譯class文件 2、eclipse bytecode visualizer怎麼用 3、java反編譯後是scala嗎 4、如何在C/C…

    編程 2024-11-26
  • javappt,javappt下載

    本文目錄一覽: 1、eclipse-java讀取ppt 2、java 怎麼把ppt轉html 3、java導出ppt太慢 4、java 用POI轉換PPT的問題 eclipse-j…

    編程 2024-11-12

發表回復

登錄後才能評論