博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
类加载-加载时机学习
阅读量:7096 次
发布时间:2019-06-28

本文共 764 字,大约阅读时间需要 2 分钟。

类加载机制就是虚拟机把class文件加载到内存,并对其进行校验、转换解析、连接、和初始化,从而形成能被虚拟机使用的Java类型。

生命周期

类从加载到内存到卸载,整个生命周期包括:

加载连接(验证、准备、解析)初始化使用卸载复制代码

加载时间

什么时候进行类加载,虚拟机并没有强制约束,但对于初始化阶段,虚拟机规范规定了只有下面5中情况对类进行初始化

1.遇到new、getstatic、putstatic、invokestatic字节指令时,如果类没有初始化过,则需先触发其初始化。即new对象实例、读取设置静态字段以及调用静态方法时2.使用反射包下的方法对类进行反射调用时,若果类没有初始化过,则触发初始化3.如果其父类没有初始化时4.虚拟机启动时,用户需指定要执行的主类及包含main方法,会先初始化主类5.动态语言,如果java.lang.invoke.MethodHandler实例最后的解析结果REF_getStatic、REF_putStatic 、REF_invokeStatic的方法句柄,并且这个方法句柄对应的类没有进行初始化复制代码

这5种场景是对类的主动引用,除此之外,所有引用类的方式都不会触发初始化,称为被动引用。

被动引用

被动引用示例:

1.通过子类引用父类的静态属性,子类不会初始化2.通过数组定义引用类,不会触发其初始化3.常量在编译阶段会存入调用类的常量池,调用常量不会触发定义常量的类的初始化复制代码

接口加载过程

接口加载过程和类的加载有些不同:

1.类使用static{}块初始化信息;接口不使用static块加载,但是编译器会为接口生成
()类构造器。2.接口在初始化时,并不要求其发接口全部都完成初始化,只有在真正用到父接口时才会初始化;这点与类不一样。复制代码

转载地址:http://vzeql.baihongyu.com/

你可能感兴趣的文章
我的友情链接
查看>>
我的友情链接
查看>>
Wav数据格式的44个字节头部信息汇总
查看>>
修改eclipse默认工作空间和删除工作空间
查看>>
Delphi下遍历文件夹下所有文件的递归算法
查看>>
liunx 中 find常见用法示例 / linux下递归删除目录下所有asp文件
查看>>
Java中创建对象的5种方式
查看>>
angularjs-currency 过滤器
查看>>
H3C-1000S 内部服务器映射
查看>>
Linux负载均衡软件LVS+keepalived
查看>>
世界500强某知名日企面试题库
查看>>
MySQL MyISAM 库转换为InnoDB的方法
查看>>
使用Python读Excel数据Insert到MySQL
查看>>
linux chkconfig and umask
查看>>
gridview数据如何导出到word,excel
查看>>
每天一个linux命令(14):head 命令
查看>>
我的友情链接
查看>>
win2008安装win7主题
查看>>
ssh端口转发,先转载,最后自用心得
查看>>
我的友情链接
查看>>