什么是类加载
类加载是Java类加载器把编译好的.class文件加载到Java虚拟机(JVM)中的运行时数据区中,供执行引擎调用。
Java类加载层级
类加载的继承是通过组合而不是继承实现的。
- 启动类加载器(BootClassLoader): Java虚拟机启动后创建的第一个类加载器,由C++语言实现,所以我们在Java代码中查看其信息时,看到的均为 null。
- 扩展类加载器(ExtClassLoader): Java语言实现,父类加载器为 null。
- 系统类加载器(AppClassLoader): Java语言实现,父类加载器为 ExtClassLoader 继承 URLClassLoader。
- 用户自定义类加载器(CustomClassLoader): Java编写,用户自定义的类加载器,可加载指定路径的class文件。
双亲委派机制
在JVM中表示两个class对象是否为同一个类对象存在两个必要条件:
- 类的完整类名必须一致,包括包名。
- 加载这个类的ClassLoader(指ClassLoader实例对象)必须相同。
当某个类加载器需要加载某个.class文件时,它首先把这个任务委托给他的上级类加载器,递归这个操作,如果上级的类加载器没有加载,自己才会去加载这个类。
双亲委派作用
- 防止重复加载同一个.class。通过委托去向上面问一问,加载过了,就不用再加载一遍。保证数据安全。
- 保证核心.class不能被篡改。通过委托方式,不会去篡改核心.clas,即使篡改也不会去加载,即使加载也不会是同一个.class对象了。不同的加载器加载同一个.class也不是同一个Class对象。这样保证了Class执行安全。