【发布时间】:2017-11-16 02:33:22
【问题描述】:
Java 中的ClassLoader 是一个用于在Java 中加载类文件的类。
java.lang.ClassLoader 是一个抽象类
我的问题是这个 java.lang.ClassLoader 类是否与 JVM 的类加载器(1.引导类加载器 2.扩展类加载器 3.系统类加载器)相关?
或者这个 java.lang.ClassLoader 是一个单独的类,可以用来创建一个自定义的类加载器?
类加载器是 Java 运行时环境的一部分,可将 Java 类动态加载到 Java 虚拟机中。它负责定位库、读取内容并加载库中包含的类。当 JVM 启动时,使用三个类加载器
引导类加载器
扩展类加载器
系统类加载器
Bootstrap 类加载器加载核心 java 库。它是用本机代码编写的。引导类加载器负责将 java.lang.Object 等关键 Java 类和其他运行时代码加载到内存中。运行时类打包在 jre/lib/rt.jar 文件中。
扩展类加载器加载扩展目录中的代码。由 ExtClassLoader 类实现。
系统类加载器在映射到系统类路径变量的 java.class.path 上找到的代码。它由 AppClassLoader 类实现。默认情况下,所有用户类都由系统类加载器加载。
Java ClassLoader 是分层的,每当提出加载类的请求时,它都会将其委托给它的父类,从而在运行时环境中保持唯一性。如果父类加载器没有找到该类,则类加载器本身会尝试加载该类。
所以这意味着第一个系统类加载器会将请求委托给扩展类加载器,扩展类加载器会将请求委托给引导类加载器,如果找不到,它将搜索类,然后扩展类加载器将搜索类,如果找不到,然后系统类加载器将搜索类,如果找不到则抛出 ClassNotFoundException
JVM 是否总是以 System class loader 开始加载类?
如有错误请指正
【问题讨论】:
标签: java jvm classloader