美文网首页
13 类初始化

13 类初始化

作者: 陈桐Caliburn | 来源:发表于2020-05-21 13:07 被阅读0次

gojvm目录
1、搭建go环境
2、cmd命令行参数解析
3、搜索class文件
4、添加testOption 便于单元测试
5、解析classfile文件
6、运行时数据区
7、指令集
8、解释器
9、创建Class
10、类加载器
11、对象实例化new object
12、方法调用和返回
13 类初始化
14、jvm支持数组
15、jvm支持字符串-数组扩展
16、本地方法调用
17、ClassLoader原理
18、异常处理
19、 启动jvm

类初始化触发情况

1、执行new指令创建类实例
2、执行putstatic、getstatic 指令存取类的静态变量
3、执行invokestatic调用静态方法
4、初始化一个类时,类的超类还没有初始化,要先初始化超类
5、执行某些反射操作

type Class struct{
//其他字段
    initStarted bool
}

func (self *Class) InitStarted() bool {
    return self.initStarted
}

// setter
func (self *Class) StartInit() {
    self.initStarted = true
}

初始化逻辑

在指令 putstatic、getstatic、new、invokestatic 添加初始化逻辑

    if !class.InitStarted() {
        frame.RevertNextPC()
        base.InitClass(frame.Thread(), class)
        return
    }
func (self *Frame) RevertNextPC() {
    self.nextPC = self.thread.pc
}

base逻辑

func InitClass(thread *rtda.Thread, class *heap.Class) {
    class.StartInit()             // 设置开始初始化标志
    scheduleClinit(thread, class) // 准备执行类初始化方法,push到栈顶,下一次执行的时候就会执行<cinit>
    initSuperClass(thread, class) // 循环初始化父类
}

func scheduleClinit(thread *rtda.Thread, class *heap.Class) {
    clinit := class.GetClinitMethod()
    if clinit != nil {
        // exec <clinit>
        newFrame := thread.NewFrame(clinit)
        thread.PushFrame(newFrame)
    }
}

func initSuperClass(thread *rtda.Thread, class *heap.Class) {
    if !class.IsInterface() {
        superClass := class.SuperClass()
        if superClass != nil && !superClass.InitStarted() {
            InitClass(thread, superClass)
        }
    }
}

实战项目地址

https://github.com/yinlingchaoliu/jvmgo.git

相关文章

  • 13 类初始化

    gojvm目录1、搭建go环境2、cmd命令行参数解析3、搜索class文件4、添加testOption 便于单元...

  • ios系统NSObject对象的cache

    1、iOS 13 对 一类型class 第一次初始化时间过长,约 300ms;如再次对这一类class 初始化,用...

  • chapter5 初始化与清理

    chapter5 初始化与清理2019年11月13日19:49 在首次使用类(调用类的静态方法、new类的对象)时...

  • 类加载机制(1)类加载过程

    目录 一、什么是类的加载(类初始化)[#jump1]1、分清类初始化和对象初始化[#jump1_1]2、类的初始化...

  • 十二、初始化

    初始化 类、结构体、枚举都可以定义初始化器 (本章主要讲类的初始化) 类有2种初始化器 指定初始化器 便捷初始化器...

  • Java学习笔记 - 类方法与代码块的执行顺序

    类的初始化顺序 静态初始化块位于类的第一次初始化最前端执行,先父类后子类,是类的初始化块。 初始化块位于每次对象被...

  • swift初始化器

    初始化器 类、结构体、枚举都可以定义初始化器 类初始化器 类有2种初始化器:指定初始化器(designated i...

  • Swift 初始化

    初始化器initializer 类、结构体、枚举都可以定义初始化器,类似init方法。 类的初始化 类有2种初始化...

  • 初始化顺序

    1.装载类:先装载父类(完成父类静态初始化)再装载子类(完成子类静态初始化) 附:静态初始化包括静态变量初始化,静...

  • Swift-学习笔记--初始化

    初始化 类、结构体、枚举都可以定义初始化器 类有2中初始化器:指定初始化器、便捷初始化器 每个类至少有一个指定初始...

网友评论

      本文标题:13 类初始化

      本文链接:https://www.haomeiwen.com/subject/opjzohtx.html