阅读Java反编译后的代码

深碍√TFBOYSˉ_ 2022-03-22 05:22 402阅读 0赞

~~对于一个优秀的JAVA工程师,应关注和研究底层的机制和具体计算机如何执行。所以,将编译后的字节码文件(.class)反编译成.java文件,阅读jvm执行的代码是很重要的研究方法

方法一:
0,widows+R,执行cmd,选择要编译的文件的目录

1,将写好的.java文件编译

2, 将编译成功后的.class文件反编译

如下实例:

  1. javac Decompilation.java
  2. javap -c Decompilation.class >> a.txt

方法二:
通过反编译工具与插件 查看java *.class 文件源码
https://blog.csdn.net/androidolblog/article/details/46438679

3,查阅资料(字节码指令大全)来阅读反编译后的代码
https://www.cnblogs.com/longjee/p/8675771.html

如实例是我实验的一个小例子:
—>Java文件代码

  1. public class TrieTest {
  2. public static void main(String[] args) {
  3. int i = 10;
  4. int n = i++%5;
  5. System.out.println(i + " : " + n);
  6. }
  7. }

—>反编译后的主要代码

  1. public static void main(java.lang.String[]);
  2. Code:
  3. 0: bipush 10 // 10 值带符号扩展成int值入栈
  4. 2: istore_1 // 将栈顶int类型值保存到局部变量1(10)中
  5. 3: iload_1 // 从局部变量1中装载int类型值入栈(栈顶10)
  6. 4: iinc 1, 1 // 将整数值constbyte加到indexbyte指定的int类型的局部变量(istore_1)
  7. 7: iconst_5 // 5(int)值入栈
  8. 8: irem // 将栈顶两int类型数(10,5)取模,结果入栈
  9. 9: istore_2 // 将栈顶int类型值保存到局部变量2(0)中
  10. 10: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
  11. 13: new #3 // class java/lang/StringBuilder
  12. 16: dup
  13. 17: invokespecial #4 // Method java/lang/StringBuilder."<init>":()V
  14. 20: iload_1 // 从局部变量1(11)中装载int类型值入栈
  15. 21: invokevirtual #5 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
  16. 24: ldc #6 // String :
  17. 26: invokevirtual #7 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
  18. 29: iload_2 // 从局部变量2(0)中装载int类型值入栈
  19. 30: invokevirtual #5 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
  20. 33: invokevirtual #8 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
  21. 36: invokevirtual #9 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
  22. 39: return
  23. }

执行后结果
在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,402人围观)

还没有评论,来说两句吧...

相关阅读