Java中类加载器及双亲委派机制原理
类加载器是Java虚拟机提供给应用程序去实现获取类和接口字节码数据的技术,由类加载器加载java中的类使其能够使用。类加载器分为以下几种
类加载器
1.启动类加载器
作用:加载Java中最核心的类
由C++编写(jdk8及之前)。无法通过代码获得类加载器
默认加载Java安装目录/jre/lib下的类文件,比如rt.jar,tools.jar,resources.jar等
2.扩展类加载器
允许扩展Java中比较通用的类
默认加载Java安装目录/jre/lib/ext下的类文件
3.应用程序类加载器
加载应用使用的类
加载classpath下的类,自己编写和maven中的类都由这个类加载器加载
双亲委派机制
Java虚拟机中有多个类加载器,双亲委派机制决定类由哪个加载器加载
作用:1.保证类加载的安全性。2.避免类重复加载
执行流程
1.要加载一个类A,先由底开始向上检查,如果检查到类A在该加载器中加载过,那么直接返回类实例
2.如果检查到顶层发现类加载器都没有加载过,那么先由顶层的类加载器尝试加载,具体的方式为:判断类A是否应该由自己加载,如果不应该,则委派给下层继续尝试加载,直到检查到正确的类加载器加载类A
3.后续如果再要创建一个类A实例,那么再次进行第一步,应该会在某个类加载器中检查到该类已经被加载过,进行返回
加载具备继承关系的类时:
打破双亲委派机制
场景:在一个服务中有两个应用,分别有一个全限定名相同的类,但是实现的功能不同,如果简单的进行加载,无法实现两个应用的该类实现不同的功能。这是由于类加载器根据全限定名判断该类有没有被加载过。
这个时候就要打破双亲委派机制,即创建一个类加载器继承ClassLoader,重写loadclass方法,用这个类加载器去加载对应的类,这样就可以实现分别加载。
只有 相同类加载器+相同类全限定名才会被认为是同一个类