类加载机制

类的生命周期
加载——验证——准备——解析——初始化——使用——卸载
加载,验证,准备,初始化和卸载这5个阶段的顺序是确定的,类的加载过程按照这种顺序按部就班地开始,而解析阶段则不一定;有时候它可以在初始化阶段之后再开始,这是为了支持Java语言的运行时绑定.
类加载的五个阶段
加载——验证——准备——解析——初始化
加载阶段就是找到类的静态存储结构并加载到虚拟机,然后转换成方法区的运行时数据结构,生成class对象的过程.加载阶段用户可以自定义类加载器参与进来.
验证阶段主要是确保字节码是合法的,确保不会对虚拟机安全造成危害,可以通过-Xverify:none禁用一些验证.
准备阶段是确定内存布局,初始化类变量,注意是赋初始值,不会执行程序自己定义的赋值操作,譬如 private static int count=12; 这里的 count 会初始化为0,而不是12.
解析阶段是将符号引用变成直接应用。
初始化阶段才是调用程序自定义代码,譬如 private static int count=12 这里的count 会设置为12,初始化阶段会生成<clinit>()方法,这个方法由编译器自动收集类中的所有类变量的赋值动作和静态语句块中的语句合并产生,同一个类加载器下,一个类型只会初始化一次。
Java虚拟机没有强制约束何时开始加载阶段,但规定了有且只有5种情况必须立刻进行初始化,当然在初始化之前 加载,验证,准备 已经开始.
初始化的时机
1.遇到new,getstatic,pustaic,invokstatic 这4条字节码指令时,如果类没有初始化,则需要触发初始化.这里要注意 final修饰的类字段,会在编译期把结果放入常量池,所以即便调用也不会触发初始化.
2.使用java.lang.reflect包的方法对类进行反射调用时,如果类没有初始化,则需要先初化.
3.当初始化一个类时,如果发现其父类还没有进行过初始化,则需要先触发其父类初始化.
4.虚拟机启动时,用户需要制定一个要执行的主类,虚拟机会先初始化这个主类.
5.使用jdk1.7动态语言支持时,如果java.lang.invoke.MethodHandle实例最后解析结果是REF_getStatic、REF_putStatic、REF_invokeStatic的方法句柄,并且这个方法句柄对应的类没有初始化,则需要先初始化.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值