淺談javap命令拆解字節(jié)碼文件
目的拆解分析反編譯字節(jié)碼 解析成人能夠理解的結(jié)構(gòu) ,然后再對(duì)字節(jié)碼文件進(jìn)一步分析
源代碼
public class test { private static int classV =2; public static void main(String[] args) { classV =200; int localV =4; localV =400; } }
二進(jìn)制
idea bin_ed插件查看。
看不懂 那就使用人能看的懂的匯編語言查看類文件結(jié)構(gòu)和代碼指令。
javap 指令和選項(xiàng)
0:無選項(xiàng)
打印package, protected and public fields, and methods public class com.example.test { public com.example.test(); public static void main(java.lang.String[]); static {}; }
1:輔助指令
-help
–help
-?
2:代碼行號(hào)和方法的局部變量表
-l
public class com.example.test { //默認(rèn)構(gòu)造方法 public com.example.test(); //代碼行號(hào):命令偏移位置 LineNumberTable: line 3: 0 //局部變量表 LocalVariableTable: Start Length Slot Name Signature 0 5 0 this Lcom/example/test; public static void main(java.lang.String[]); //代碼行號(hào):命令偏移位置 LineNumberTable: line 6: 0 line 7: 6 line 8: 8 line 9: 12 //局部變量表 LocalVariableTable: Start Length Slot Name Signature 0 13 0 args [Ljava/lang/String; //方法參數(shù) 8 5 1 localV I。/局部變量localV //靜態(tài)代碼塊 static {}; LineNumberTable: line 4: 0 }
3 用級(jí)別過濾方法 屬性 類
-public
-protected
-private
-p
4.反匯編 出匯編指令
javap -c
//純匯編指令 public class com.example.test { public com.example.test(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object."<init>":()V 4: return public static void main(java.lang.String[]); Code: 0: sipush 200 3: putstatic #2 // Field classV:I 6: iconst_4 7: istore_1 8: sipush 400 11: istore_1 12: return static {}; Code: 0: iconst_2 1: putstatic #2 // Field classV:I 4: return }
5 顯示verbose詳細(xì)信息
javap -v
Classfile /Users/zhangshanxue/Downloads/akka-quickstart-java/target/classes/com/example/test.class //javap -sysinfo顯示下面3行 Last modified 2021-4-5; size 507 bytes MD5 checksum 24a0c74751aafd61d0f7f69be9c161db Compiled from "test.java" public class com.example.test //即1.8 對(duì)照表和原因見附錄1 //u2類型 即每個(gè)占用兩個(gè)字節(jié) minor version: 0 major version: 52 //類標(biāo)志 見附錄2 //u2類型access_flags 通過位與表示多個(gè)權(quán)限 flags: ACC_PUBLIC, ACC_SUPER //常量池。class文件結(jié)構(gòu)重點(diǎn) //u2 2兩個(gè)字節(jié) 表示數(shù)量 //pool 常量池 //constant_pool_count 和constant_pool[]表示為常量池中內(nèi)容 //后面大部分內(nèi)容依賴此常量池 Constant pool: #1 = Methodref #4.#22 // java/lang/Object."<init>":()V #2 = Fieldref #3.#23 // com/example/test.classV:I #3 = Class #24 // com/example/test #4 = Class #25 // java/lang/Object #5 = Utf8 classV #6 = Utf8 I #7 = Utf8 <init> #8 = Utf8 ()V #9 = Utf8 Code #10 = Utf8 LineNumberTable #11 = Utf8 LocalVariableTable #12 = Utf8 this #13 = Utf8 Lcom/example/test; #14 = Utf8 main #15 = Utf8 ([Ljava/lang/String;)V #16 = Utf8 args #17 = Utf8 [Ljava/lang/String; #18 = Utf8 localV #19 = Utf8 <clinit> #20 = Utf8 SourceFile #21 = Utf8 test.java #22 = NameAndType #7:#8 // "<init>":()V #23 = NameAndType #5:#6 // classV:I #24 = Utf8 com/example/test #25 = Utf8 java/lang/Object { public com.example.test(); descriptor: ()V flags: ACC_PUBLIC Code: //代碼匯編指令 stack=1, locals=1, args_size=1 0: aload_0 1: invokespecial #1 // Method java/lang/Object."<init>":()V 4: return //Javap -l顯示下面信息 //行號(hào)和上面對(duì)應(yīng)的指令偏移位置 LineNumberTable: line 3: 0 LocalVariableTable: //局部變量表 在指令偏移位置start start+length之間有效 Start Length Slot Name Signature 0 5 0 this Lcom/example/test; public static void main(java.lang.String[]); descriptor: ([Ljava/lang/String;)V flags: ACC_PUBLIC, ACC_STATIC Code: //代碼匯編指令 stack=1, locals=2, args_size=1 0: sipush 200 3: putstatic #2 // Field classV:I 6: iconst_4 7: istore_1 8: sipush 400 11: istore_1 12: return //Javap -l顯示下面信息 //行號(hào)和上面對(duì)應(yīng)的指令偏移位置 LineNumberTable: line 6: 0 line 7: 6 line 8: 8 line 9: 12 LocalVariableTable: Start Length Slot Name Signature 0 13 0 args [Ljava/lang/String; 8 5 1 localV I static {}; descriptor: ()V flags: ACC_STATIC Code: stack=1, locals=0, args_size=0 0: iconst_2 1: putstatic #2 // Field classV:I 4: return //行號(hào)和上面對(duì)應(yīng)的指令偏移位置 LineNumberTable: line 4: 0 }
附錄1
1.1從45開始因?yàn)檎桨l(fā)布之前可能 其他版本號(hào)可能已經(jīng)被用了
1.5改為5.0 也是差不多原因 為了表示重要性更名
Corresponding major version 指定版本 和"Supported major versions"兼容范圍
附錄2
附錄3
直接分析字節(jié)碼塊
1為了方便交流表達(dá)class文件的結(jié)構(gòu)
使用u1 u2 u4 u8無符號(hào)數(shù)表示字節(jié)數(shù)使用*_info 結(jié)尾表示池(數(shù)組cp_info、field_info、method_info、attribute_info
ClassFile { //表示java class的文件格式 固定為cafe baby 4個(gè)字節(jié) u4 magic; //主版本號(hào)和次版本號(hào)共同決定了類文件格式的版本 //u2類型 即每個(gè)占用兩個(gè)字節(jié) //56包含56以后support for N.0 and N.65535 u2 minor_version; //主版本號(hào)56(java12)之前 minjor只支持0 u2 major_version; //常量池?cái)?shù)量 u2 constant_pool_count; cp_info constant_pool[constant_pool_count-1]; u2 access_flags; //this_class、super_class、interfaces指向常量池的CONSTANT_Class_info u2 this_class; u2 super_class; u2 interfaces_count; u2 interfaces[interfaces_count]; u2 fields_count; //指向常量池structures:CONSTANT_Fieldref_info 結(jié)構(gòu) field_info fields[fields_count]; u2 methods_count; //指向常量池CONSTANT_Methodref_info 結(jié)構(gòu) method_info methods[methods_count]; u2 attributes_count; attribute_info attributes[attributes_count]; }
附錄4
常量池字節(jié)碼結(jié)構(gòu)和常量池結(jié)構(gòu)部分對(duì)應(yīng)關(guān)系
以上就是拆解字節(jié)碼文件javap命令的詳細(xì)內(nèi)容,更多關(guān)于拆解字節(jié)碼文件javap命令的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- 學(xué)會(huì)Java字節(jié)碼指令,成為技術(shù)大佬
- Java之字節(jié)碼以及優(yōu)勢(shì)案例講解
- Java字節(jié)碼增強(qiáng)技術(shù)知識(shí)點(diǎn)詳解
- 詳解Java動(dòng)態(tài)字節(jié)碼技術(shù)
- 詳解Java字節(jié)碼編程之非常好用的javassist
- Java字節(jié)碼中jvm實(shí)例用法
- Javassist如何操作Java 字節(jié)碼
- Java中invokedynamic字節(jié)碼指令問題
- java獲取版本號(hào)及字節(jié)碼編譯版本方法示例
- java 獲取字節(jié)碼文件的幾種方法總結(jié)
- java 中如何獲取字節(jié)碼文件的相關(guān)內(nèi)容
- java字節(jié)碼框架ASM操作字節(jié)碼的方法淺析
- java字節(jié)碼框架ASM的深入學(xué)習(xí)
- Java 將字符串動(dòng)態(tài)生成字節(jié)碼的實(shí)現(xiàn)方法
- 通過java字節(jié)碼分析學(xué)習(xí)對(duì)象初始化順序
- Java字節(jié)碼的增強(qiáng)技術(shù)
相關(guān)文章
SpringBoot實(shí)現(xiàn)配置文件加密的方案分享
項(xiàng)目的數(shù)據(jù)庫密碼、redis 密碼等明文展示在配置文件中會(huì)有潛在的風(fēng)險(xiǎn),因此采用合適的安全防護(hù)措施是有必要的,下面小編就為大家介紹一下SpringBoot中配置文件加密的方法,希望對(duì)大家有所幫助2023-11-11SpringBoot快速整合RabbitMq小案例(使用步驟)
這篇文章主要介紹了SpringBoot快速整合RabbitMq小案例,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06基于maven使用IDEA創(chuàng)建多模塊項(xiàng)目
這篇文章主要介紹了基于maven使用IDEA創(chuàng)建多模塊項(xiàng)目,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-04-04Spring系統(tǒng)屬性及spring.properties配置文件示例詳解
spring中有一個(gè)SpringProperties類,來保存spring的系統(tǒng)屬性,本文結(jié)合實(shí)例代碼對(duì)Spring系統(tǒng)屬性及spring.properties配置文件相關(guān)知識(shí)給大家介紹的非常詳細(xì),需要的朋友參考下吧2023-07-07關(guān)于Java中修飾符的總結(jié)(fina除外)
下面小編就為大家?guī)硪黄P(guān)于Java中修飾符的總結(jié)(fina除外)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-09-09Springcloud ribbon負(fù)載均衡算法實(shí)現(xiàn)
這篇文章主要介紹了Springcloud ribbon負(fù)載均衡算法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04把Jar文件轉(zhuǎn)成exe安裝文件的實(shí)現(xiàn)方法
下面小編就為大家?guī)硪黄袹ar文件轉(zhuǎn)成exe安裝文件的實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-11-11Spring-cloud 注冊(cè)服務(wù)提供者搭建方法
本篇文章主要介紹了Spring-cloud 注冊(cè)服務(wù)提供者搭建方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-04-04springboot掃描引入jar包的service等組件方式
這篇文章主要介紹了springboot掃描引入jar包的service等組件方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07