一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 淺談javap命令拆解字節碼文件

淺談javap命令拆解字節碼文件

2021-09-02 15:1120481024 Java教程

這篇文章主要介紹了拆解字節碼文件javap命令,對反編譯感興趣的同學可以參考下

目的拆解分析反編譯字節碼 解析成人能夠理解的結構 ,然后再對字節碼文件進一步分析

源代碼

  1. public class test {
  2. private static int classV =2;
  3. public static void main(String[] args) {
  4. classV =200;
  5. int localV =4;
  6. localV =400;
  7. }
  8. }

二進制 idea bin_ed插件查看。

淺談javap命令拆解字節碼文件

看不懂 那就使用人能看的懂的匯編語言查看類文件結構和代碼指令。

javap 指令和選項

淺談javap命令拆解字節碼文件

0:無選項

  1. 打印package, protected and public fields, and methods
  2. public class com.example.test {
  3. public com.example.test();
  4. public static void main(java.lang.String[]);
  5. static {};
  6. }

1:輔助指令

-help –help -?

2:代碼行號和方法的局部變量表

-l

  1. public class com.example.test {
  2.  
  3. //默認構造方法
  4. public com.example.test();
  5. //代碼行號:命令偏移位置
  6. LineNumberTable:
  7. line 3: 0
  8. //局部變量表
  9. LocalVariableTable:
  10. Start Length Slot Name Signature
  11. 0 5 0 this Lcom/example/test;
  12.  
  13. public static void main(java.lang.String[]);
  14. //代碼行號:命令偏移位置
  15. LineNumberTable:
  16. line 6: 0
  17. line 7: 6
  18. line 8: 8
  19. line 9: 12
  20. //局部變量表
  21. LocalVariableTable:
  22. Start Length Slot Name Signature
  23. 0 13 0 args [Ljava/lang/String; //方法參數
  24. 8 5 1 localV I。/局部變量localV
  25.  
  26. //靜態代碼塊
  27. static {};
  28. LineNumberTable:
  29. line 4: 0
  30. }

3 用級別過濾方法 屬性 類

-public -protected -private -p

淺談javap命令拆解字節碼文件

4.反匯編 出匯編指令

javap -c

  1. //純匯編指令
  2. public class com.example.test {
  3. public com.example.test();
  4. Code:
  5. 0: aload_0
  6. 1: invokespecial #1 // Method java/lang/Object."<init>":()V
  7. 4: return
  8.  
  9. public static void main(java.lang.String[]);
  10. Code:
  11. 0: sipush 200
  12. 3: putstatic #2 // Field classV:I
  13. 6: iconst_4
  14. 7: istore_1
  15. 8: sipush 400
  16. 11: istore_1
  17. 12: return
  18.  
  19. static {};
  20. Code:
  21. 0: iconst_2
  22. 1: putstatic #2 // Field classV:I
  23. 4: return
  24. }

5 顯示verbose詳細信息

javap -v

  1. Classfile /Users/zhangshanxue/Downloads/akka-quickstart-java/target/classes/com/example/test.class
  2. //javap -sysinfo顯示下面3行
  3. Last modified 2021-4-5; size 507 bytes
  4. MD5 checksum 24a0c74751aafd61d0f7f69be9c161db
  5. Compiled from "test.java"
  6. public class com.example.test
  7. //即1.8 對照表和原因見附錄1
  8. //u2類型 即每個占用兩個字節
  9. minor version: 0
  10. major version: 52
  11. //類標志 見附錄2
  12. //u2類型access_flags 通過位與表示多個權限
  13. flags: ACC_PUBLIC, ACC_SUPER
  14. //常量池。class文件結構重點
  15. //u2 2兩個字節 表示數量
  16. //pool 常量池
  17. //constant_pool_count 和constant_pool[]表示為常量池中內容
  18. //后面大部分內容依賴此常量池
  19. Constant pool:
  20. #1 = Methodref #4.#22 // java/lang/Object."<init>":()V
  21. #2 = Fieldref #3.#23 // com/example/test.classV:I
  22. #3 = Class #24 // com/example/test
  23. #4 = Class #25 // java/lang/Object
  24. #5 = Utf8 classV
  25. #6 = Utf8 I
  26. #7 = Utf8 <init>
  27. #8 = Utf8 ()V
  28. #9 = Utf8 Code
  29. #10 = Utf8 LineNumberTable
  30. #11 = Utf8 LocalVariableTable
  31. #12 = Utf8 this
  32. #13 = Utf8 Lcom/example/test;
  33. #14 = Utf8 main
  34. #15 = Utf8 ([Ljava/lang/String;)V
  35. #16 = Utf8 args
  36. #17 = Utf8 [Ljava/lang/String;
  37. #18 = Utf8 localV
  38. #19 = Utf8 <clinit>
  39. #20 = Utf8 SourceFile
  40. #21 = Utf8 test.java
  41. #22 = NameAndType #7:#8 // "<init>":()V
  42. #23 = NameAndType #5:#6 // classV:I
  43. #24 = Utf8 com/example/test
  44. #25 = Utf8 java/lang/Object
  45. {
  46. public com.example.test();
  47. descriptor: ()V
  48. flags: ACC_PUBLIC
  49. Code:
  50. //代碼匯編指令
  51. stack=1, locals=1, args_size=1
  52. 0: aload_0
  53. 1: invokespecial #1 // Method java/lang/Object."<init>":()V
  54. 4: return
  55. //Javap -l顯示下面信息
  56. //行號和上面對應的指令偏移位置
  57. LineNumberTable:
  58. line 3: 0
  59. LocalVariableTable:
  60. //局部變量表 在指令偏移位置start start+length之間有效
  61. Start Length Slot Name Signature
  62. 0 5 0 this Lcom/example/test;
  63.  
  64. public static void main(java.lang.String[]);
  65. descriptor: ([Ljava/lang/String;)V
  66. flags: ACC_PUBLIC, ACC_STATIC
  67. Code:
  68. //代碼匯編指令
  69. stack=1, locals=2, args_size=1
  70. 0: sipush 200
  71. 3: putstatic #2 // Field classV:I
  72. 6: iconst_4
  73. 7: istore_1
  74. 8: sipush 400
  75. 11: istore_1
  76. 12: return
  77. //Javap -l顯示下面信息
  78. //行號和上面對應的指令偏移位置
  79. LineNumberTable:
  80. line 6: 0
  81. line 7: 6
  82. line 8: 8
  83. line 9: 12
  84. LocalVariableTable:
  85. Start Length Slot Name Signature
  86. 0 13 0 args [Ljava/lang/String;
  87. 8 5 1 localV I
  88.  
  89. static {};
  90. descriptor: ()V
  91. flags: ACC_STATIC
  92. Code:
  93. stack=1, locals=0, args_size=0
  94. 0: iconst_2
  95. 1: putstatic #2 // Field classV:I
  96. 4: return
  97. //行號和上面對應的指令偏移位置
  98. LineNumberTable:
  99. line 4: 0
  100. }

附錄1

1.1從45開始因為正式發布之前可能 其他版本號可能已經被用了 1.5改為5.0 也是差不多原因 為了表示重要性更名

淺談javap命令拆解字節碼文件

Corresponding major version 指定版本 和"Supported major versions"兼容范圍

附錄2

淺談javap命令拆解字節碼文件

附錄3

直接分析字節碼塊

1為了方便交流表達class文件的結構

使用u1 u2 u4 u8無符號數表示字節數使用*_info 結尾表示池(數組cp_info、field_info、method_info、attribute_info

  1. ClassFile {
  2. //表示java class的文件格式 固定為cafe baby 4個字節
  3. u4 magic;
  4. //主版本號和次版本號共同決定了類文件格式的版本
  5. //u2類型 即每個占用兩個字節
  6. //56包含56以后support for N.0 and N.65535
  7. u2 minor_version;
  8. //主版本號56(java12)之前 minjor只支持0
  9. u2 major_version;
  10. //常量池數量
  11. u2 constant_pool_count;
  12. cp_info constant_pool[constant_pool_count-1];
  13. u2 access_flags;
  14. //this_class、super_class、interfaces指向常量池的CONSTANT_Class_info
  15. u2 this_class;
  16. u2 super_class;
  17. u2 interfaces_count;
  18. u2 interfaces[interfaces_count];
  19. u2 fields_count;
  20. //指向常量池structures:CONSTANT_Fieldref_info 結構
  21. field_info fields[fields_count];
  22. u2 methods_count;
  23. //指向常量池CONSTANT_Methodref_info 結構
  24. method_info methods[methods_count];
  25. u2 attributes_count;
  26. attribute_info attributes[attributes_count];
  27. }

附錄4

常量池字節碼結構和常量池結構部分對應關系

淺談javap命令拆解字節碼文件

以上就是拆解字節碼文件javap命令的詳細內容,更多關于拆解字節碼文件javap命令的資料請關注服務器之家其它相關文章!

原文鏈接:https://blog.csdn.net/zt011052/article/details/115445687

延伸 · 閱讀

精彩推薦
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7472021-02-04
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
主站蜘蛛池模板: 日本黄色一区 | 亚洲精品m在线观看 | 亚洲性视频在线观看 | 我被黑人彻底征服的全文 | 欧美日韩免费一区二区在线观看 | 日本黄a三级三级三级 | 国产成人在线播放视频 | 国产亚洲女在线精品 | 国产拍拍拍免费专区在线观看 | 男生和老师一起差差差 | 情缘免费观看完整版 | 国产日韩欧美在线一区二区三区 | 免费又爽又黄禁片视频在线播放 | h日本漫画全彩在线观看 | 国产在线精品香蕉综合网一区 | 日韩天堂网 | 国产成人精品1024在线 | 五月九九 | 亚洲一区二区精品视频 | 美女认你摸 | 欧美坐爱| 白丝美女同人18漫画 | 精灵之森高清在线 | 天美麻豆 | 91夜夜人人揉人人捏人人添 | 手机在线观看国产精选免费 | 日韩欧美在线看 | 国产成人精品系列在线观看 | 精品国产福利在线观看一区 | 男女视频在线观看 | 国产亚洲欧美在线中文bt天堂网 | 惩罚美女妲己的尤老师 | 欧美在线高清 | 美女胸又大又黄又www小说 | 互换娇妻爽文100系列小说 | 亚洲高清无码在线 视频 | 欧美兽皇另类 | 52zfl宅福利yxpjw | 2022av小四郎的最新地址 | 午夜在线观看免费完整直播网 | 久久国产精品免费网站 |