阅读Java反编译后的代码
~~对于一个优秀的JAVA工程师,应关注和研究底层的机制和具体计算机如何执行。所以,将编译后的字节码文件(.class)反编译成.java文件,阅读jvm执行的代码是很重要的研究方法
方法一:
0,widows+R,执行cmd,选择要编译的文件的目录
1,将写好的.java文件编译
2, 将编译成功后的.class文件反编译
如下实例:
javac Decompilation.java
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文件代码
public class TrieTest {
public static void main(String[] args) {
int i = 10;
int n = i++%5;
System.out.println(i + " : " + n);
}
}
—>反编译后的主要代码
public static void main(java.lang.String[]);
Code:
0: bipush 10 // 10 值带符号扩展成int值入栈
2: istore_1 // 将栈顶int类型值保存到局部变量1(10)中
3: iload_1 // 从局部变量1中装载int类型值入栈(栈顶10)
4: iinc 1, 1 // 将整数值constbyte加到indexbyte指定的int类型的局部变量(istore_1)
7: iconst_5 // 5(int)值入栈
8: irem // 将栈顶两int类型数(10,5)取模,结果入栈
9: istore_2 // 将栈顶int类型值保存到局部变量2(0)中
10: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
13: new #3 // class java/lang/StringBuilder
16: dup
17: invokespecial #4 // Method java/lang/StringBuilder."<init>":()V
20: iload_1 // 从局部变量1(11)中装载int类型值入栈
21: invokevirtual #5 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
24: ldc #6 // String :
26: invokevirtual #7 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
29: iload_2 // 从局部变量2(0)中装载int类型值入栈
30: invokevirtual #5 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
33: invokevirtual #8 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
36: invokevirtual #9 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
39: return
}
执行后结果
还没有评论,来说两句吧...