类加载器是java虚拟机提供给应用程序去 实现获取类和接口字节码数据 的技术
类加载器的分类:
- 一类是 Java代码中实现的
- 一类是 Java虚拟机底层源代码实现的
通常可以细分为三大类:jdk8版本中的
- java代码中的
- 扩展类加载器:Extension 允许扩展Java中比较通常的类 (比较通用但是不特别重要)
- 应用程序类加载器Application 加载应用所使用的类,还有一些第三方中jar包中的类
- java虚拟机中的
- 启动类加载器Bootstrap:加载java中最核心的类 比如String类
可以通过Arthas中的类加载器查看:
//使用下面的命令
$ classloader
启动加载器
(Bootstrap ClassLoader)是由Hotspot虚拟机提供的、使用C++编写的类加载器。
默认加载Java安装目录/jre/lib下的类文件,比如rt.jar,tools.jar,resources.jar等。
- 通过启动类加载器去加载用户的jar包:
- 放入jre/lib下去进行扩展:
- 不推荐,可能会出现即使放进去由于文件名不匹配的问题也不会正常的被加载。
- 使用参数进行扩展:
- 推荐,使用-Xbootclasspath/a:jar包目录/jar包名进行扩展
- 放入jre/lib下去进行扩展:
扩展类加载器+应用程序类加载器:
- 扩展类加载器和应用程序加载器都是JDK中提供的,使用Java编写的类加载器
- 他们的源码都位于sun.misc.Launcher中,是一个静态内部类。继承字URLClassLoader。具备通过目录或者指定jar包将字节码文件加载到内存中。
扩展类加载器:
- 默认加载Java安装目录/jre/lib/ext下的类文件
通过扩展类加载器区加载用户jar包:
- 放入/jre/lib/ext下进行扩展
- 使用参数进行扩展
- 推荐,使用-Djava.ext.dirs=jar包目录 进行扩展,这这种凡是会覆盖掉原始目录,可以用;(windows):(macos/linux)追加上原始目录。
双亲委派机制:
由于Java虚拟机中有多个类加载器,双亲委派机制的核心是解决一个类到底由谁加载的问题。
双亲委派机制的详细内容我会在下一篇文章介绍