Java是一门"半编译半解释"型语言.通过使用jdk提供的javac编译器可以将Java源码编译为Java虚拟机(Java Virtual Machine, JVM)可读的字节码(bytecode),即*.class文件.
学习字节码可以使你更好的理解Java虚拟机的行为,甚至对学习其它基于Java虚拟机的语言(如:Scala,Clojure,Kotlin等)有很大的帮助
入门
实际上*.class文件并不是人类可读的文件格式,我们可以使用JDK提供的反会汇编器javap来分析字节码
Hello.java
class Hello {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
这可能是大家接触的第一个Java程序,我们先使用=> javac Hello.java编译得到Hello.class文件.然后使用javap -c -verbose将文件反汇编
常量池
其中Constant pool就是传说中的常量池.
常量池可以看作是一个数组,#后面的数字代表数组的索引.
=后面是数组的值.
第一列代表这个常量的tag,第二列会根据tag的不同而不同.
以Class为例,tag为Class的常量结构体为
CONSTANT_Class_info {
u1 tag;</