java编译器源码解析-语义分析-生成字节码
但具体内容在ClassWriter.writeClass()完成.其中ClassWriter.writeClassFile()负责输出字节码。
要从AST生成字节码了,那么还需要完成一次转换,就是把AST的节点转换成可操作的实体Item。
com.sun.tools.javac.jvm.Items.Item还有很多子类,分别对应的是字节码可操作的实体,比如本地变量、字面量、方法、表达式等,
每个Item都支持一套标准的操作,能帮助生成字节码,最常用的方法load()、store()、invoke()、coerce()
load():生成把当前Item加载到栈的字节码
store():生成从栈顶保存到该 Item 的字节码
invoke():生成调用该Item对应的方法的字节码。
coerce():强制类型转换。
另外需要注意的是com.sun.tools.javac.jvm.Code类,它里面存放了生成各种字节码的指令的方法emitXXX(),所有jvm虚拟机的指令都能在这里找到。 com.sun.tools.javac.jvm.ClassWriter负责输出字节码
最后生成的字节码保存在 MethodSymbol 的 code 属性中。