类加载机制:
虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被Java虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。
类加载的生命周期:
1.加载:通过一个类的全名来获取定义此类的二进制字节流,并将这些静态数据转换成方法区中的运行时数据结构,在堆中生成一个代表这个类的java.lang.Class对象,作为方法区类数据的访问入口,这个过程需要类加载器参与。
2.验证:验证二进制字节流是否 符合虚拟机约束,并且能被当前虚拟机处理(虚拟机是向下兼容的,也就是1.7编译的class能被1.8的虚拟机处理,以此类推)。
3.准备:正式为类变量分配内存并为类变量设置初始值(方法区进行)。
4.解析:将常量池中的符号引用替换成直接引用。
5.初始化:执行类构造器<clinit>()方法的过程。
其中验证、准备、解析可以称为链接阶段。
补充:
二进制字节流获取方式:
1.从zip中读取,jar、war、ear
2.从网络中获取,applet
3.运行时计算机生成,动态代理。
4.有其他文件生成,jsp
5.从数据中读取,中间件服务器SAP NetWeaver
类构造器<clinit>:
由编译器自动收集类中的所有类变量的赋值动作和静态代码块中的语句合并产生的,编译器收集的顺序是由语句在源文件的顺序决定的。