一、javac -verbose Book.java
编译java文件成class文件,同时可以看到jar的加载过程。

从这个结果可以看出, java compiler 至少做了 1.分析 java 源文件 2.搜索源文件路径 3.搜索类文件路径 4.加载依赖的类 5.把结果写入 .class 文件
其中 javac 主要的作用就是把 java 源文件编译为 class 文件,class 文件中主要有三部分,一是 class 常量池,二是 java 类的各种属性结构,三是 method info 结构中的code[] 中保存的字节码指令序列,这三部分中,指令序列主要对应了 java 源文件中的方法中的语句;各种属性结构,主要对应了类中各种标识符的签名标签、属性修饰等,比如 字段、方法、接口、类 的各种修饰符,还有 method 签名的结构,比如 返回值、参数列表中的参数类型;常量池主要就是保存类的定义中涉及到的常量数据,比如 int long float double utf-8,其中所有涉及到的标识符、字符串最终就保存为 utf-8 形式。jvm 在执行这个 class 文件中的函数的时候,很重要的工作就是解析这些符号引用。
二、javap -verbose StackTest
查看字节码指令,可以通过指令分析执行过程,同时用sublime打开class文件,可以查看其16进制文件

并且通过 指令偏移量-助记符,应用程序计数器、局部变量表、栈帧操作数来做示意图,具体可以参见 文章六、 Class字节码指令解析
网友评论