(1)ClassLoader 基本概念
与 C 或 C ++ 编写程序不同,Java 程序并不是一个可执行文件, 而是有许多独立的类文件组成的, 每一个文件对应一个 Java 类. 此外, 这些类并非全副装入内存, 而是依据程序须要逐步载入.
ClassLoader 是 JVM 实现的一部分,ClassLoader 包含 bootstrap classloader(启动类加载器),ClassLoader 在 JVM 运行的时候加载 Java 外围的 API, 以满足 Java 程序最根本的需要, 其中就包含用户定义的 ClassLoader, 这里所谓的用户自定义, 是指通过 java 程序实现的两个 ClassLoader: 一个是 ExtClassLoader(Extension Class Loader), 它的作用是用来加载 Java 的扩大 API, 也就是 /lib/ext 中的类; 第二个是 AppClassLoader(Application Class Loader), 它是用来加载用户机器上 CLASSPATH 设置目录中的 Class 的, 通常在没有指定 ClassLoader 的状况下, 程序员自定义的类就由该 ClassLoader 进行加载.
(2)ClassLoader 加载流程
当运行一个程序的时候,JVM 启动, 运行 bootStrap classloader, 该 ClassLoader 加载 Java 外围 API(ExtClassLoader 和 AppClassLoader 也在此时被加载), 而后调用 ExtClassLoader 加载扩大 API, 最初 AppClassLoader 加载 CLASSPATH 目录下定义的 Class, 这就是一个程序最根本的加载流程.
一个类加载的过程应用了一种父类委托模式, 为什么要应用这种父类委托模式?
1) 能够防止反复加载, 当父类曾经加载了该类的时候, 就没必要子 ClassLoader 再加载一次.
2) 思考到平安因素, 如果不应用这种委托模式, 那么能够随时应用自定义的 String 来动静代替 java 外围 API 中的定义类型, 这样会存在十分大的隐患, 而父类委托的形式就能够防止这种状况, 因为 String 曾经在启动时被加载了, 所以, 用户自定义类时无奈加载一个自定义的 ClassLoader.