激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - 淺談javap命令拆解字節(jié)碼文件

淺談javap命令拆解字節(jié)碼文件

2021-09-02 15:1120481024 Java教程

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

目的拆解分析反編譯字節(jié)碼 解析成人能夠理解的結(jié)構(gòu) ,然后再對(duì)字節(jié)碼文件進(jìn)一步分析

源代碼

  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. }

二進(jìn)制 idea bin_ed插件查看。

淺談javap命令拆解字節(jié)碼文件

看不懂 那就使用人能看的懂的匯編語(yǔ)言查看類文件結(jié)構(gòu)和代碼指令。

javap 指令和選項(xiàng)

淺談javap命令拆解字節(jié)碼文件

0:無(wú)選項(xiàng)

  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:代碼行號(hào)和方法的局部變量表

-l

  1. public class com.example.test {
  2.  
  3. //默認(rèn)構(gòu)造方法
  4. public com.example.test();
  5. //代碼行號(hào):命令偏移位置
  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. //代碼行號(hào):命令偏移位置
  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; //方法參數(shù)
  24. 8 5 1 localV I。/局部變量localV
  25.  
  26. //靜態(tài)代碼塊
  27. static {};
  28. LineNumberTable:
  29. line 4: 0
  30. }

3 用級(jí)別過(guò)濾方法 屬性 類

-public -protected -private -p

淺談javap命令拆解字節(jié)碼文件

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詳細(xì)信息

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 對(duì)照表和原因見(jiàn)附錄1
  8. //u2類型 即每個(gè)占用兩個(gè)字節(jié)
  9. minor version: 0
  10. major version: 52
  11. //類標(biāo)志 見(jiàn)附錄2
  12. //u2類型access_flags 通過(guò)位與表示多個(gè)權(quán)限
  13. flags: ACC_PUBLIC, ACC_SUPER
  14. //常量池。class文件結(jié)構(gòu)重點(diǎn)
  15. //u2 2兩個(gè)字節(jié) 表示數(shù)量
  16. //pool 常量池
  17. //constant_pool_count 和constant_pool[]表示為常量池中內(nèi)容
  18. //后面大部分內(nèi)容依賴此常量池
  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. //行號(hào)和上面對(duì)應(yīng)的指令偏移位置
  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. //行號(hào)和上面對(duì)應(yīng)的指令偏移位置
  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. //行號(hào)和上面對(duì)應(yīng)的指令偏移位置
  98. LineNumberTable:
  99. line 4: 0
  100. }

附錄1

1.1從45開(kāi)始因?yàn)檎桨l(fā)布之前可能 其他版本號(hào)可能已經(jīng)被用了 1.5改為5.0 也是差不多原因 為了表示重要性更名

淺談javap命令拆解字節(jié)碼文件

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

附錄2

淺談javap命令拆解字節(jié)碼文件

附錄3

直接分析字節(jié)碼塊

1為了方便交流表達(dá)class文件的結(jié)構(gòu)

使用u1 u2 u4 u8無(wú)符號(hào)數(shù)表示字節(jié)數(shù)使用*_info 結(jié)尾表示池(數(shù)組cp_info、field_info、method_info、attribute_info

  1. ClassFile {
  2. //表示java class的文件格式 固定為cafe baby 4個(gè)字節(jié)
  3. u4 magic;
  4. //主版本號(hào)和次版本號(hào)共同決定了類文件格式的版本
  5. //u2類型 即每個(gè)占用兩個(gè)字節(jié)
  6. //56包含56以后support for N.0 and N.65535
  7. u2 minor_version;
  8. //主版本號(hào)56(java12)之前 minjor只支持0
  9. u2 major_version;
  10. //常量池?cái)?shù)量
  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 結(jié)構(gòu)
  21. field_info fields[fields_count];
  22. u2 methods_count;
  23. //指向常量池CONSTANT_Methodref_info 結(jié)構(gòu)
  24. method_info methods[methods_count];
  25. u2 attributes_count;
  26. attribute_info attributes[attributes_count];
  27. }

附錄4

常量池字節(jié)碼結(jié)構(gòu)和常量池結(jié)構(gòu)部分對(duì)應(yīng)關(guān)系

淺談javap命令拆解字節(jié)碼文件

以上就是拆解字節(jié)碼文件javap命令的詳細(xì)內(nèi)容,更多關(guān)于拆解字節(jié)碼文件javap命令的資料請(qǐng)關(guān)注服務(wù)器之家其它相關(guān)文章!

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

延伸 · 閱讀

精彩推薦
  • Java教程Java8中Stream使用的一個(gè)注意事項(xiàng)

    Java8中Stream使用的一個(gè)注意事項(xiàng)

    最近在工作中發(fā)現(xiàn)了對(duì)于集合操作轉(zhuǎn)換的神器,java8新特性 stream,但在使用中遇到了一個(gè)非常重要的注意點(diǎn),所以這篇文章主要給大家介紹了關(guān)于Java8中S...

    阿杜7472021-02-04
  • Java教程Java BufferWriter寫文件寫不進(jìn)去或缺失數(shù)據(jù)的解決

    Java BufferWriter寫文件寫不進(jìn)去或缺失數(shù)據(jù)的解決

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

    spcoder14552021-10-18
  • Java教程20個(gè)非常實(shí)用的Java程序代碼片段

    20個(gè)非常實(shí)用的Java程序代碼片段

    這篇文章主要為大家分享了20個(gè)非常實(shí)用的Java程序片段,對(duì)java開(kāi)發(fā)項(xiàng)目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程xml與Java對(duì)象的轉(zhuǎn)換詳解

    xml與Java對(duì)象的轉(zhuǎn)換詳解

    這篇文章主要介紹了xml與Java對(duì)象的轉(zhuǎn)換詳解的相關(guān)資料,需要的朋友可以參考下...

    Java教程網(wǎng)2942020-09-17
  • Java教程Java實(shí)現(xiàn)搶紅包功能

    Java實(shí)現(xiàn)搶紅包功能

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

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

    升級(jí)IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級(jí),尋思已經(jīng)有好久沒(méi)有升過(guò)級(jí)了。升級(jí)完畢重啟之后,突然發(fā)現(xiàn)好多錯(cuò)誤,本文就來(lái)介紹一下如何解決,感興趣的可以了解一下...

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

    Java使用SAX解析xml的示例

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

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

    小米推送Java代碼

    今天小編就為大家分享一篇關(guān)于小米推送Java代碼,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧...

    富貴穩(wěn)中求8032021-07-12
主站蜘蛛池模板: 美国av片在线观看 | 久草视频手机在线观看 | 国产理论视频在线观看 | 日韩毛片网站 | wwwxxx国产| 国产乱淫av片免费观看 | 久久精品欧美一区 | 久艹在线视频 | 狠狠干天天操 | 国产在线精品一区二区三区不卡 | 日韩精品网站在线观看 | 日本在线视频一区二区三区 | 精品一区二区久久久久久按摩 | 青青草成人影视 | 爽毛片| 天天碰天天操 | 92自拍视频 | 91专区在线观看 | 久久精品国产99国产精品澳门 | h视频在线免费观看 | 一本色道久久综合狠狠躁篇适合什么人看 | 成人在线观看免费视频 | 亚洲精品久久久久久久久久久 | 久久91久久久久麻豆精品 | 久久久久久久黄色片 | 久草在线观看福利 | 91短视频在线观看 | 久久久一区二区三区四区 | 99久久久精品视频 | 国产九九热视频 | 老女人碰碰在线碰碰视频 | 亚洲影院在线 | 91av久久| 亚洲精品成人18久久久久 | 看片一区| 日本人乱人乱亲乱色视频观看 | 性盈盈盈影院 | 免费视频观看 | 日本精品久久久一区二区三区 | 亚洲人成网站在e线播放 | 一级毛片免费观看 |