java 类加载 双亲委派 破坏双亲委派

类加载过程

加载:在硬盘上查找并通过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、相同的类加载器

你可能感兴趣的:(java 类加载 双亲委派 破坏双亲委派)