一。Java 有三大加载器
根类加载器 boostrap 扩展类加载器 extention 系统加载器 APP
根类主要是为了 加载jvm初始化一些必须的东西;
扩展类只要是 jdk/jre/lib/ext/中的扩展类
系统加载器就是java项目中classpath中的类
加载类原则是,获取当前类的加载器(委托加载器),自上而下去 加载器 去加载 根类--> 扩展类--> 系统加载器 --> 自定义加载器(如果有的话)
这个流程中随便哪一级查找到需要加载的类,就会返回该类的实例
如果没有找到就会 继续用委托加载器 加载类的 加载器再加载一次,如果还是没有找到 就会 报 clssNotFundException
自定义的类加载器要继承 Java.lang.ClassLoad 并重写 findClass方法
类的加载分为 :
1.加载 2.连接 3.初始化
加载: 找到类进行加载到jvm 中,以二进制流的形式放到jvm的方法区中
连接:
1.验证 :格式检查,语义检查,字节码检查,验证符号引用是否存在直接引用
2:准备 : 就是给静态变量赋值,初始化的值 比如 int 赋值=0 long =0l .......
3. 解析: 将符号引用转为直接引用 ;
初始化:对类的静态变量进行赋值的操作
首先是 父级的静态代码块 --自己的静态代码块 --父级的成员变量赋值 --自己的成员变量赋值 --父级的构造方法-自己的构造方法
Class.form 和 loadClass.classLoad 都可以获取一个类的class
但是class.form会初始化一个类
而 loadClass.classLoad ,只是加载一个类,并不会去连接和初始化