引导类加载器(启动类加载器)
- C/C++编写的
- 用于加载核心类库,例如
jdk1.8.0_281\jre\lib\rt.jar
等,String类即在此时加载 - 加载自定义类加载器,包括扩展类加载器和系统类加载器
- 出于安全考虑此阶段只加载包名为
java
,javax
,sun
等开头的类 - 没有父加载器
自定义类加载器
- 用java编写的
- JVM规范中,除了引导类加载器,剩下统称为自定义类加载器
- 均派生于
java.lang.ClassLoader
,可以通过getClassLoader()
方法获取父加载器
扩展类加载器(sun.misc.Launcher.ExtClassLoader)
- 加载
java.ext.dirs
属性中指定目录中的类库,以及jdk1.8.0_281\jre\lib\ext
目录中的类库 - 父加载器为引导类加载器
系统类加载器(sun.misc.Launcher.AppClassLoader)
- 用户编写的所有类默认将通过此加载器加载
- 父类加载器为扩展类加载器
- 加载
classpath
以及java.class.path
属性指定目录中的类库
何时定义自定义类加载器?
- 隔离加载类,避免不同应用所需要的类相互冲突,例如tomcat
- 修改类加载方式,动态加载
- 扩展加载源,加载其他目录或者从其他存储介质加载字节码文件
- 防止源代码泄露,例如对字节码文件进行加密然后通过自定义加载器进行解密
20210506 UPDATE
JVM中判断两个class对象是否为同一个类的必要条件:
- 类名及包名完全一致
- 加载这个类的类加载器一致