写在前面:
关于字节码,就是***.java文件经过javac编译成***.class文件中的内容,但是都是二进制,经过反编译后才能看到其中内容。
关于查阅字节码的作用,就是知道.class文件经过classloader加载进内存后发生了什么。
可以用来解释一些平时不会思考到的问题,
比如,finally块中的内容为什么一定会被执行? try语句包裹内容为什么尽量要少?
为什么只要其他类用不到的方法尽量都要是private?各种语法糖是怎么实现的?静态代码块和静态变量初始化的先后顺序?
for循环、while循环的区别在哪等等。。。。
javap 、 asm 、jclasslib这仨,感觉学习要从javap学起,使用的话用jclasslib,asm这个不很熟,但是对着原始代码看很方便。
正文
1. javap
jvm自带的命令,javac是编译,javap是反编译,如图javac 接javap可在命令行看到反编译的字节码内容,注意javac -g 没有-g的话反编译回来各个方法内没有localVariablesTable。
特点:使用原生命令,多个追加参数,初学容易但是查看麻烦,多个版本比对的话还要写个小脚本输出保存到本地。
D:\JavaProject\concurrent\src\main\java\com\htyl\t1>javac -g Demo01.java
D:\JavaProject\concurrent\src\main\java\com\htyl\t1>