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实现了从模块中加载字节码文件。平台类加载器的存在更多的是为了与老版本的设计方案兼容,自身没有特殊的逻辑