《自己动手写java虚拟机》学习笔记
zookeeper
这个作者很懒,什么都没留下…
展开
-
一、解析命令行参数
本章实现的是使用命令行java命令启动java虚拟机,运行java应用,对传入的参数进行解析。参数主要包括java应用的路径(也就是classpath),main方法所在的类路径,jre路径。 cmd.go使用go的flag类库对参数进行解析,参数格式Usage: %s [-options] class [args...]func readCmd() *Cmd { cmd:...原创 2019-02-02 13:00:41 · 574 阅读 · 1 评论 -
二、类加载之class文件的读取
获取到命令行参数之后,可以开始启动jvm了。启动jvm的第一步就是用类加载器加载main方法所在的类,这样才能开始执行main方法。本章主要说的就是类加载的第一步:class文件的读取,而读到class文件之后如何解析将在下一章介绍。为了保证java类库的安全性,java类加载器需要遵循双亲委派原则。也就是说有三个主要的类加载器: 1.bootstrap类加载器,加载的是/jre/li...原创 2019-02-02 20:38:22 · 1984 阅读 · 0 评论 -
三、类加载之class文件的解析
类加载的几个阶段中,在读取类文件之后,就是类文件的解析阶段。本文讲的只是将类文件解析成结构化的形式,类解析阶段的另一部分--字段和方法的静态链接放到后面再讲。使用ClassFile来定义class 文件的格式,具体属性如下。class文件都以魔数CAFEBABE开头,用以标识这是一个class文件。还有类的访问控制,类名,父类名以及类的方法和类的属性等。constantPool保存了类的所有字...原创 2019-08-26 10:27:27 · 830 阅读 · 0 评论 -
四、类加载之准备阶段
前面已经把类文件加载了出来,并且将字节流转化成了易用的数据结构,下面就是类的验证和准备阶段了。验证阶段在书中忽略了,所以这里只包括准备阶段。准备阶段主要是给类变量分配空间,赋上默认值,static final变量赋上初始值。如下所示,用slot数组保存静态变量。type Class struct { 。。。 staticSlotCount uint staticVars ...原创 2019-08-31 10:10:47 · 510 阅读 · 0 评论 -
五、类加载之解析阶段
解析阶段就是要把类常量池中类,字段,方法的符号引用转成可以使用的直接引用。例如一个类的解析就是通过类名查找类,并保存这个类的class对象的引用,有了class对象的直接引用才能使用这个类。虚拟机规范并没有规定符号引用的解析在何时执行,只要在使用之前解析完成就行。我这里实现是把静态解析放在了类加载的时候,方法动态链接放在运行时,如果像书中一样都放在运行时解析也是可以的。静态链接方法如下,遍历类...原创 2019-09-11 11:55:51 · 776 阅读 · 0 评论