5 类加载器分类

5 类加载器分类

启动类加载器(Bootstrap)

  • 启动类加载器(Bootstrap ClassLoader) 是由Hotspot虚拟机提供的、使用C++编写的类加载器
  • 默认加载Java安装目录/jre/lib下的类文件,比如rt.jar,tools.jar,resources.jar等。

通过启动类加载器加载jar包

  • 放入jre/lib下进行扩展(不推荐),尽可能不要去更改JDK安装目录中的内容,会出现即使放进去,由于文件名不匹配的问题也不会正常地被加载
  • 使用参数进行扩展(推荐),使用-Xbootclasspath/a:jar包目录/jar包名 进行扩展

扩展类加载器和应用程序类加载器

  • 扩展类加载器应用程序类加载器都是JDK中提供的、使用Java编写的类加载器
  • 它们的源码都位于sun.misc.Launcher中,是一个静态内部类。继承自URLClassLoader。具备通过目录或者指定jar包将字节码文件加载到内存中

扩展类加载器(Extension Class Loader)

​ 扩展类加载器(Extension Class Loader)是JDK中提供的使用Java编写的类加载器,默认加载Java安装目录/jre/lib/ext下的类文件

  • 放入/jre/lib/ext下进行扩展(不推荐),尽可能不要去更改JDK安装目录中的内容
  • 使用参数进行扩展(推荐),使用-Djava.ext.dirs=jar包目录进行扩展,这种方式会覆盖掉原始目录,可以用;(windows):(macos/linux)追加上原始目录

应用程序类加载器(Application)

​ 加载classpath下的类文件

JDK9及之后类加载器的变化

​ JDK9引入了module的概念,类加载器在设计上发生了很多变化

  • 启动类加载器使用Java编写,位于jdk.internal.loaderClassLoaders类中。Java中的BootClassLoader继承自BuiltinClassLoader实现从模块中找到要加载的字节码资源文件
  • 启动类加载器依然无法通过java代码获取到,返回的仍然是null,保持了统一
  • 扩展类加载器被替换成了平台类加载器 (Platform Class Loader)。平台类加载器遵循模块化方式加载字节码文件,所以继承关系从URLClassLoader变成了BuiltinClassLoader,BuiltinClassLoader实现了从模块中加载字节码文件。平台类加载器的存在更多的是为了与老版本的设计方案兼容,自身没有特殊的逻辑
posted @ 2024-03-05 15:40  渺阴丶  阅读(29)  评论(0)    收藏  举报