类的加载过程
step 1 加载:方法区添加访问入口
- 1)获取字节流:通过一个类的全限定名来获取定义此类的二进制字节流;
注:没有规矩从某个class文件获得,这里可以从zip获取(jar、war等);从网络获得(web Applet) - 2)转换字节流结构:将这个字节流代表的静态存储结构传化为方法区的运行时数据结构;
- 3)生成方法区的访问入口:内存生成这个类的java.lang.class对象,作为方法区访问这个类各种数据的访问入口
step 2 验证:验证class文件字节流信息符合约束
- 1)文件格式验证:格式是否符合规范(比如整数加减法要验证9&8的格式是否是整数,class文件也要验证各个字节规则是否符合规范)
- 2)元数据验证:类的信息是否符合规范(保证保证明明不是抽象类但是有未实现的抽象方法,这就不符合规范了,还有类似的)
- 3)字节码验证:保证语义逻辑是合法的(比如两个不能强转的类型强制转换了)
- 4)符号引用验证:是否缺少或被静止方法它依赖的其他资源(比如依赖了个private的资源)
step 3 准备:为类定义的静态变量分配空间并设初始值
注:public static int a=123;这里是先a=0,再a=123;准备阶段负责的就是a=0的部分,即为变量赋0值
step 4 解析:将常量池中的符号引用替换为直接引用
step 5 初始化:执行类构造器()方法的过程
上述文字大致如下图所示
类加载器
- 作用:如图所示实现加载过程中的获取字节流这一过程
注:不同类加载器加载的同一个类文件,会使得两个类不“相等“