-
java虚拟机类加载
添加时间:2013-7-1 点击量:Java类初始化前提
(1)类加载的机会:
a) 生命周期:加载,验证,筹办,解析,初始化,应用,卸载。
b) 5个断定的加载次序,验证,筹办,初始化,卸载。
c) 初始化的前提(有且仅有的四个前提):
i. 碰到new,getstatic,putstatic,invokestatic字节码时,若未初始化,触发。
ii. 反射调用的时辰,若没有初始化,触发;
iii. 初始化类时,若父类未初始化,触发;
iv. 虚拟机启动是,主类(含有main办法)触发初始化;
要点:
(1)子类中调用父类的静态字段,只会触发父类的初始化,不会触发子类的初始化;
(2)New一个类的数组的时辰,不会触发类的初始化阶段;
(3)类调用static final常量,不会触发类的初始化。
特列:
接口的初始化和类的初始化稍有不合,接口中没有static代码块。差别在于类初始化前提第三条的父类初始化,若是接口则不须要初始化接口的时辰初始化父类接口,只有当引用父类的时辰才会进行初始化。
Java类加载过程
(1)加载:
a) 按照类的权限制名获取二进制字节俭;
b) 将上述动作获取的字节俭中代表的静态存储成果转化为运行是数据布局;
c) 在java堆中生成一个class对象,作为数据接见进口。
(2)验证(确认字节俭信息合适虚拟机请求):
a) 文件格局验证:确保获取的二进制字节俭可以或许正确解析,并存储于办法区中;
b) 元数据验证:进行语析,确保合适java说话规范;
c) 字节码验证:首要进行数据流和把握流解析;
d) 符号引用验证:确保解析阶段正常运行,若无法经由过程验证,抛出异常。
(3)筹办(正式为变量分派内存并设置类变量初始值的阶段)
初始化的项目组只是变量,凡是景象下都为零值。
若是具有final润饰,则初始化为指定的值。
(4)解析
将常量池里面的符号引用转化为直接引用的过程
a) 类或者接口的解析:
i. 若不是数组类型,传递全限制名给当前类的加载器;
ii. 若是数组类型,并且为对象元素,类似Integer类,则遵守第一点加载元素类型,若是integer类,直接生成维度堆
iii. 上述步调没有异常,则进行符号引用验证,确认接见权限。
b) 字段解析:
ⅰ. 本身具有简单名和字段描述都与目标相匹配的字段,则返回;
ⅱ.不然,若是有接话柄现,从上往下递归搜刮,找到则返回;
ⅲ.不然,遵守持续关系,从上往下递归搜刮,找到则返回;不然抛出异常;
   c) 类办法解析
     和字段申明稍微有点不合的处所是,找办法时先找父类,而不是接口。其他逻辑就是找到匹配的则返回。这里要断定本身是否为抽象类,因为匹配到的办法可能是实现的接口列表以及父接口的办法;不然NOsuchmethod异常
d) 接口办法解析
与类办法的过程是一样的。差别就是不须要剖断是不是实现过该办法。
(5)初始化
这个阶段是开端履行java代码的时辰。这个阶段是履行机关函数的过程。
Java类加载器
Java里面的三类加载器:启动类加载器,扩大类加载器,应用法度类加载器。推荐应用的双亲委派模型。每一次的加载都请求先把这个加载恳求发到父类加载器进行加载,所有的加载恳求终极都邑传给启动类加载器,只有当父类加载器反馈回来不克不及完成加载恳求,则测验测验本身加载。
OSGI 则是破损双亲委派模型的案例之一。
无论对感情还是对生活,“只要甜不要苦”都是任性而孩子气的,因为我们也不完美,我们也会伤害人。正因为我们都不完美,也因为生活从不是事事如意,所以对这些“瑕疵”的收纳才让我们对生活、对他人的爱变得日益真实而具体。—— 汪冰《世界再亏欠你,也要敢于拥抱幸福》