类加载器和双亲委派机

67 阅读2分钟

类加载器:

在明白了整个类从加载到初始化的过程,就有必要了解类加载器的概念,因为实现上述过程是必须依靠加载器来实现的。

类加载器虽然只用于实现类的加载动作,但他在java程序中起到的作用却远超类加载阶段,对于任意一个类,都必须由加载他的类加载器和这个类本身一起共同确立其在java虚拟机中的唯一性,每一个类加载器都拥有一个独立的类名称空间。这句话可以表达的更通俗一些:比较两个类是否相等,只有在这两个类是由同一个类加载器加载的前提下才有意义,否则即使这两个类来源于同一个class文件,被同一个java虚拟机加载,只要加载他们的类加载器不同,那这两个类就必定不相等。

java类加载器分为一下几种:

1.启动类加载器Bootstrap ClassLoader:主要负责加载java_home/jre/lib下的类

2.扩展类加载器Extension ClassLoader:主要负责加载java_home/jre/lib/ext下的类

3.应用程序类加载器Application ClassLoader:主要加载classpath环境变量所指定的路径中的类,可以理解为加载我们自己写的java代码

4.自定义类加载器

双亲委派机制:

image.png 先让父类加载器试图加载该类,只有在父类加载器无法加载该类时才尝试从自己的类路径中加载该类。意图是保证java类型体系中最基础的行为一致,优先加载JDK中的类

好处:java类随着它的类加载器一起具备了一种带有优先级的层次关系。例如类java.lang.Object,它存放在rt.jar中,无论哪个类加载器要加载这个类,最终都会委派给启动类加载器进行加载,因此Object类在程序的各种类加载器环境中都是同一个类。相反,如果用户自己写了一个名为java.lang.Object的类,并放在程序的Classpath中,那系统中将会出现多个不同的Object类,java类型体系中最基础的行为也无法保证,应用程序也会变得一片混乱。

类加载器中的核心方法:

image.png