Java中有哪些类加载器? 类加载器工作原理?

JDK⾃带有三个类加载器:bootstrap ClassLoaderExtClassLoaderAppClassLoader

BootStrapClassLoader(引导类加载器):

  • 根类加载器,依赖于底层操作系统,由C编写而成
  • 默认负责加载jre\lib⽂件夹下的jar包和class⽂件。
  • 负责加载虚拟机的核心类库,如java.lang.*。Object类就是由根类加载器加载的

ExtClassLoader(标准扩展类加载器):

  • 它的父加载器为根类加载器,是AppClassLoader的⽗类加载器,由java编写而成
  • 负责加载jre\lib\ext⽂件夹下的jar包和class类。
  • 如果把我们的jar文件放在该目录下,也会自动由扩展类加载器加载。
  • ext目录:extend 翻译过来就是扩展, 也就是存放扩展的资料,就不属于Java自带的,也就是那些程序需要用到的jar包

AppClassLoader(应用程序类路径类加载器丶系统类加载器):

  • 它的父加载器为扩展类加载器。由java编写而成
  • 它从环境变量classpath或者系统属性java.class.path所指定的目录中加载类,是用户自定义的类加载器的默认父加载器

类加载器工作原理

  • Java类加载器是用来在运行时加载类(*.class文件)
  • 也就是jvm解释器工作的时候,将.class文件解释为二进制机器码文件

工作的流程

双亲委派机制: 如果一个类加载器收到类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类(双亲)加载器完成。

  1. 首先判断该类之前是否已加载,逐级向父类判断之前是否加载,之前加载过就结束
  2. 若之前都没加载,则传自顶向下调用双亲加载器加载
  3. 若父类加载器都没能成功加载它,则自己用findClass()去加载.所以是个向上递归的过程
  • 如果所有加载器都找不到,就会丢出NoClassDefFoundError
  • ClassNotfoundException是在编译时JVM加载不到.java文件导致的;
  • .java文件编译为.class文件时找不到java文件
  • NoClassDefError是在运行时JVM加载不到.class文件导致的;
  • .class文件解释为二进制机器码文件时找不到.class文件
  • 类加载器是在运行阶段,过了编译期来到了解释阶段,类加载器工作时,就不会出现ClassNotfoundException

java 项目导致服务器满载 java服务加载器_开发语言

为什么要使用这种机制?

  • 是因为父亲已经加载了该类的时候,就没有必要子ClassLoader再加载一次。
  • 防止重复加载同一个.class。通过委托去向上面问一问,加载过了,就不用再加载一遍。保证数据安全。
  • 如果不使用这种委托模式,那就可以随时使用自定义的String替代java的String,这是不行的

大帅比,点赞了没?