class文件的周期
- Loading 到内存
- Linking
verification (验证class文件,“cafe babe”)
preperation (class静态变量赋默认值 int->0 object->null)
resolution - initializing (静态变量赋初始值)
Loading 的过程
ClassLoader
有4个ClassLoader,自上而下为:
1. bootstrap (C++实现的,Java中调用c++的方法)
2. ExtClassLoad
3. AppClassLoad
4. 自定义ClassLoad
4个ClassLoader 通过 双亲委派 的方法进行加载class文件
双亲委派
即:classload加载class文件,首先先向上询问自己的父加载器(不是父类,是classload里的parent属性)是否已加载此class文件(类似于缓存,用一个set来保存已加载的class),一直询问到最上层的classload,如果有则返回;如果没有,则调用自己的loadClass方法进行加载,若无法加载,则向下让子加载器调用loadClass加载,一直到最后一层若还妹有加载,抛出classNotFount异常。
双亲委派由loadClass方法实现
源码如下:
在这里插入代码片
自定义ClassLoader
- 集成 ClassLoad类,重写findClass方法
public class