类加载器
**作用 :**加载 Class 文件 类加载器什么时候需要加载类: 1、隐式加载:new() ,会隐式的调用类加载器去加载类。获取到对应Class类后自动进行实例化 2、显示加载LoadoadClass和forName
类加载的流程:(类装载过程) 1、加载:将class文件字节码以二进制流形式读入内存,并在堆中生成Class对象(作为此类的入口) 2、连接: (1)检查:检查字节码的有效性、安全性 (2)准备:为类变量分配空间 (JDK8及以后,类变量存储在堆中的Class对象中),并赋类型零值 (3)解析:将符号引用解析成直接引用 3、初始化:执行了()方法,这个方法是由javac编译器通过按序收集,源码中的类变量赋值动作和static代码块组合而成。注意:在代码块之前类变量的可以访问,之后的只能赋值
类加载的机制: 1、类加载器的种类: (1)Bootstrap ClassLoader:C++编写,是JVM虚拟机的一部分。负责加载JDK的核心类库(java与javax.开头的包下的类都是它加载的)。JAVA_HOME/lib/下的jar包 (2)Ext ClassLoader:负责加载JAVA_ HOME/lib/ext下的jar包 (3)Application ClassLoader:负责加载classpath下的jar包 (4)Custom ClassLoader :自定义加载路径
2、双亲委派机制:保证安全 加载一个类时,JVM会从最底层, 自底向上查看这些加载器,是否曾经加载过这个类
如果四个加载器均没有加载过这个类,JVM就会 自顶向下的尝试去加载这个类
1.APP–>EXC—B00T(最终执行) BOOT EXC APP
类加载的过程 1.类加载器收到类加载的请求! 2.将这个请求向上委托给父类加载器去完成,一直向上委托,知道启动类加载器 3.启动加载器检查是否能够加载当前这个类,能加载就结束,使用当前的加载器,否则,抛出异常,通知子加载器进行加载 4.重复步骤3
注意:Class Not Found ~ 就是因为类无法找到合适的类加载器来启动
|