类加载过程
加载:在硬盘上查找并通过IO读入字节码文件至JVM虚拟机方法区,同事在堆中创建Class对象
验证:校验字节码文件的正确性
准备:为类的静态变量分配内存, 并将其初始化为默认值,此阶段仅仅只为静态类变量(static修饰的字段变量)分配内存,并且设置该变量的初始值,(比如static int num = 5, 这里只将num初始化为0)对于final static修饰的变量,编译的时候就会分配了。 也不会分配实例变量的内存。
解析:把类中的符号引用转换为直接引用。
初始化:对类的静态变量初始化指定的值,执行静态代码块。
底层调用过程
双亲委派机制
引导了加载器:负责加载jre/lib目录下的核心类库,比如:rt.jar
扩展类加载器:负责加载jre/lib/ext目录下的jar
应用程序类加载器:负责加载ClassPaht路径下的class字节码文件,主要是加载你自己写的类
自定义加载器:负责加载用户自定义路径下的class字节码文件
补充:扩展类加载器,应用程序类加载器,自定义加载器是java,lang.ClassLoader的子类实例,自定义加载器直接继承java,lang.ClassLoader
为什么要设计双亲委派机制:
1、避免类的重复加载,当父加载器已经加载了该类时,就没有比亚欧子ClassLoader再加载一次,保证被加载类的唯一性
2、沙箱安全机制,防止核心API呗篡改。
自定义类加载器
打破双亲委派机制:
使用自定义类加载器,重写findclass / loadclass 方法
判断是否加载过判断条件
1、相同的包名、类名
2、相同的类加载器